pandas Panda Dataframe -根据其他列的条件向新列添加值

xmd2e60i  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(118)

我试图添加值到一个新的dataframe(df 2)列(折扣%),该列中的值必须基于“网格”和实体从df 1),我的结构如下x1c 0d1x
因此,如果对于同一实体,DF 1中的列为91-120,则它应该在折扣%下向DF 2添加20,如果DF 1中的列为61-90,则它必须向DF 2添加5,依此类推。
数据是从一个大的csv文件导入,到目前为止,我已经尝试了下面,但如果只填写0

for j in range(0,len(df1)):
for i in range(0,len(df2)):
if grid['91-120'][j] in df2['Grid'][i]:
#df['Grid%'][i] = grid['91-120'][j]
df2.loc[i, 'Grid%'] = df1['91-120'][j]

谢谢你

deyfvvtc

deyfvvtc1#

我目前正在处理一个与迭代 Dataframe 有关的类似问题。如果可以避免的话,你真的不想这样做,特别是如果 Dataframe 包含像DF1这样的重复值。我建议将引用 Dataframe DF1转换为具有索引方向的字典,然后将该字典中的值分配给DF2,如下所示。

DF1 = pd.DataFrame({'Entity': ['F1', 'F2', 'F3', 'F4'], '0-60': [0, 0, 0, 0], '61-90': [0, 5, 10, 5], '91-120':[20, 5, 20, 20], '121-180':[10, 5, 12, 15], '181-240':[20, 5, 22, 25]})
DF2 = pd.DataFrame({'Entity': ['F1', 'F2', 'F3', 'F4'], 'Grid': ['360+', '61-90', '0-60', '91-120']})

print('DF2 before:')
print(DF2)

DF1.drop_duplicates(inplace=True)
DF1.set_index('Entity', inplace=True)
d = DF1.to_dict('index')

def get_discount(entity, grid):
    if entity in d and grid in d[entity]:
        return d[entity][grid]
    else:
        return None

DF2['Discount %'] = DF2.apply(lambda x: get_discount(x['Entity'], x['Grid']), axis=1)

print('DF2 after:')
print(DF2)

我找到这个解决方案是因为,正如我之前提到的,我目前正在解决一个类似的问题。
知道在 Dataframe 上迭代对函数的性能有多有害,我意识到从字典中赋值会更快。我在Stack Overflowpandas documentation中查找了如何将dataframe转换为字典。接下来,我从Stack Overflow上的字典中查找如何为 Dataframe 赋值。一开始我是想找个“dict”方向。我可以让它根据“网格”为每个“实体”分配所有折扣值,但我不能选择一个正确的折扣值。
我在网上找不到任何其他解决方案来从2D字典中为dataframe赋值,所以我转向ChatGPT。ChatGPT做了它的事情之后,我在每个领域都得到了“没有”。最终,我得到了它的建议,将字典的方向从“dict”改为“系列”。这也不起作用,但我想我会尝试所有其他的方向。索引工作。
缺点是折扣%值是浮动的。优点是它可以处理字典中没有Grid值的情况(例如:其中网格是“360+”)。

相关问题