根据现有的列名和列值在 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中的其他列值创建新列[重复]

读取超大文件 R 的列名和列值

根据其他列中的值在 python 3 (pandas) 数据框中创建新列

仅基于列中的非 NaN 值在数据框中创建新行

计算由另一列值分组的列值在 pandas 数据框中的共现

将字典转换为数据框,键作为列名,键值作为数据框的列值