Python 3.x 基于条件在数据帧中创建新列

Python 3.x 基于条件在数据帧中创建新列,python-3.x,pandas,Python 3.x,Pandas,对于数据帧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_da

对于数据帧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”。第一排,, 类别为“白色”,因此应将75乘以0.60,并将45放入pop_n列中。 我想写一些东西,比如:

df['pop_n']= (df['Pop']*df['White_ratio']).where(df['category']=='W')
这只适用于一个类别。 我将非常感谢您的帮助

谢谢。

使用和:

首先,我们使用
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']
使用和:

首先,我们使用
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']

找到名称中带有下划线的列:

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

找到名称中带有下划线的列:

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

感谢回复Erfan,我使用的数据框有更长的类别名称,如白人、黑人、西班牙裔等。我在这里放了一个简化的数据框。如果您能在代码中提及要编辑的部分,我将不胜感激。您能否编辑示例数据,使其代表您的问题。我刚刚做到了,对于给您带来的不便深表歉意!是的!谢谢!感谢回复Erfan,我使用的数据框有更长的类别名称,如白人、黑人、西班牙裔等。我在这里放了一个简化的数据框。如果您能在代码中提及要编辑的部分,我将不胜感激。您能否编辑示例数据,使其代表您的问题。我刚刚做到了,对于给您带来的不便深表歉意!是的!谢谢!