根据现有的列名和列值在 python 数据框中创建列
Posted
技术标签:
【中文标题】根据现有的列名和列值在 python 数据框中创建列【英文标题】:Create columns in python data frame based on existing column-name and column-values 【发布时间】:2022-01-21 04:28:12 【问题描述】:我在 pandas 中有一个数据框:
import pandas as pd
# assign data of lists.
data = 'Gender': ['M', 'F', 'M', 'F','M', 'F','M', 'F','M', 'F','M', 'F'],
'Employment': ['R','U', 'E','R','U', 'E','R','U', 'E','R','U', 'E'],
'Age': ['Y','M', 'O','Y','M', 'O','Y','M', 'O','Y','M', 'O']
# Create DataFrame
df = pd.DataFrame(data)
df
我想要为每个现有列的每个类别创建一个具有以下格式的新列:
Gender_M -> for when the gender equals M
Gender_F -> for when the gender equal F
Employment_R -> for when employment equals R
Employment_U -> for when employment equals U
and so on...
到目前为止,我已经创建了以下代码:
for i in range(len(df.columns)):
curent_column=list(df.columns)[i]
col_df_array = df[curent_column].unique()
for j in range(col_df_array.size):
new_col_name = str(list(df.columns)[i])+"_"+col_df_array[j]
for index,row in df.iterrows():
if(row[curent_column] == col_df_array[j]):
df[new_col_name] = row[curent_column]
问题是,即使我成功地创建了列名,我也无法获得正确的列值。
例如列性别应该如下:
data2 = 'Gender': ['M', 'F', 'M', 'F','M', 'F','M', 'F','M', 'F','M', 'F'],
'Gender_M': ['M', 'na', 'M', 'na','M', 'na','M', 'na','M', 'na','M', 'na'],
'Gender_F': ['na', 'F', 'na', 'F','na', 'F','na', 'F','na', 'F','na', 'F']
df2 = pd.DataFrame(data2)
只是说,na
可以是任何东西,例如空白、点或 NAN。
【问题讨论】:
你试过pandas.pydata.org/docs/reference/api/pandas.get_dummies.html吗? 【参考方案1】:您正在寻找pd.get_dummies
。
>>> pd.get_dummies(df)
Gender_F Gender_M Employment_E Employment_R Employment_U Age_M Age_O Age_Y
0 0 1 0 1 0 0 0 1
1 1 0 0 0 1 1 0 0
2 0 1 1 0 0 0 1 0
3 1 0 0 1 0 0 0 1
4 0 1 0 0 1 1 0 0
5 1 0 1 0 0 0 1 0
6 0 1 0 1 0 0 0 1
7 1 0 0 0 1 1 0 0
8 0 1 1 0 0 0 1 0
9 1 0 0 1 0 0 0 1
10 0 1 0 0 1 1 0 0
11 1 0 1 0 0 0 1 0
【讨论】:
【参考方案2】:如果您尝试以像您的 df2 示例这样的格式获取数据,我相信这就是您正在寻找的。p>
df[['Gender']].join(pd.get_dummies(df[['Gender']]).mul(df['Gender'],axis=0).replace('',np.NaN))
输出:
Gender Gender_F Gender_M
0 M NaN M
1 F F NaN
2 M NaN M
3 F F NaN
4 M NaN M
5 F F NaN
6 M NaN M
7 F F NaN
8 M NaN M
9 F F NaN
10 M NaN M
11 F F NaN
【讨论】:
【参考方案3】:如果您可以在新列中使用 0 和 1,那么使用 get_dummies
(如 @richardec 建议的那样)应该是最直接的。
但是,如果想要在每个新列中使用特定字母,那么另一种方法是循环遍历当前列和每列中的特定类别,并使用 apply 从这些信息中创建一个新列。
for col in data.keys():
categories = list(df[col].unique())
for category in categories:
df[f"col_category"] = df[col].apply(lambda x: category if x==category else float("nan"))
结果:
>>> df
Gender Employment Age Gender_M Gender_F Employment_R Employment_U Employment_E Age_Y Age_M Age_O
0 M R Y M NaN R NaN NaN Y NaN NaN
1 F U M NaN F NaN U NaN NaN M NaN
2 M E O M NaN NaN NaN E NaN NaN O
3 F R Y NaN F R NaN NaN Y NaN NaN
4 M U M M NaN NaN U NaN NaN M NaN
5 F E O NaN F NaN NaN E NaN NaN O
6 M R Y M NaN R NaN NaN Y NaN NaN
7 F U M NaN F NaN U NaN NaN M NaN
8 M E O M NaN NaN NaN E NaN NaN O
9 F R Y NaN F R NaN NaN Y NaN NaN
10 M U M M NaN NaN U NaN NaN M NaN
11 F E O NaN F NaN NaN E NaN NaN O
【讨论】:
以上是关于根据现有的列名和列值在 python 数据框中创建列的主要内容,如果未能解决你的问题,请参考以下文章
循环以基于Python Dataframe中的其他列值创建新列[重复]