对于数据帧df:
dummy_data1 = {'category': ['White', 'Black', 'Hispanic','White'],
'Pop':['75','85','90','100'],'White_ratio':[0.6,0.4,0.7,0.35],'Black_ratio':[0.3,0.2,0.1,0.45], 'Hispanic_ratio':[0.1,0.4,0.2,0.20] }
df = pd.DataFrame(dummy_data1, columns = ['category', 'Pop','White_ratio', 'Black_ratio', 'Hispanic_ratio'])
我想通过首先检查类别,然后将“ Pop”中的值乘以列中的相应比率值,来向此数据框“ pop_n”添加新列。对于第一行, 类别为“白色”,因此应将75乘以0.60并将45放入pop_n列。 我想到写类似的东西:
df['pop_n']= (df['Pop']*df['White_ratio']).where(df['category']=='W')
这有效,但仅适用于一个类别。 我将不胜感激。
谢谢。
答案 0 :(得分:2)
使用DataFrame.filter
和DataFrame.lookup
:
首先,我们使用filter
来获取名称中带有ratio
的列。然后拆分,并将第一个单词保留在下划线之前。
最后,我们使用lookup
将category
的值与这些列进行匹配。
# df['Pop'] = df['Pop'].astype(int)
df2 = df.filter(like='ratio').rename(columns=lambda x: x.split('_')[0])
df['pop_n'] = df2.lookup(df.index, df['category']) * df['Pop']
category Pop White_ratio Black_ratio Hispanic_ratio pop_n
0 White 75 0.60 0.30 0.1 45.0
1 Black 85 0.40 0.20 0.4 17.0
2 Hispanic 90 0.70 0.10 0.2 18.0
3 White 100 0.35 0.45 0.2 35.0
答案 1 :(得分:0)
找到名称中带有下划线的列:
to_rename = {x: x.split("_")[0] for x in df if "_" in x}
找到匹配因素:
stack = df.rename(columns=to_rename)\
.set_index('category').stack()
factors = stack[map(lambda x: x[0]==x[1], stack.index)]\
.reset_index(drop=True)
将原始数据乘以以下因素:
df['pop_n'] = df['Pop'].astype(int) * factors
# category Pop White_ratio Black_ratio Hispanic_ratio pop_n
#0 White 75 0.60 0.30 0.1 45
#1 Black 85 0.40 0.20 0.4 17
#2 Hispanic 90 0.70 0.10 0.2 18
#3 White 100 0.35 0.45 0.2 35