【问题标题】:creating columns based on previous column values with condition / Python -Pandas使用条件/Python -Pandas 根据先前列值创建列
【发布时间】:2021-06-11 13:01:22
【问题描述】:

我有一个这样的数据框

D_1  D_2   D_3    D_4
Boy                 
Boy  play       
Boy  play  car      
Boy  play  chess    
Boy  play  online 

现在我想再增加 3 列 L_2、L_3 和 L_4,我可以在其中根据级别将前三列的数据数据相加,以便最终将结果 df 设为:

D_1  D_2   D_3  D_4   L_2       L_3           L_4
Boy                   boy|emp   boy|emp|emp   boy|emp|emp|emp
Boy  play             boy|play  boy|play|emp  boy|play|emp|emp
Boy  play  car        boy|play  boy|play|car  boy|play|car|emp
Girl                  Girl|emp  Girl|emp|emp  Girl|emp|emp|emp

我的 SQL 解决方案如下所示

select *
    , concat(D_1,"|",ifnull(D_2, "emp")) as L_2  
    , concat(D_1,"|",ifnull(D_2, "emp"), "|", ifnull(D_3, "emp")) as L_3  
    , concat(D_1,"|",ifnull(D_2, "emp"), "|", ifnull(D_3, "emp"), "|", ifnull(D_4, "emp")) as L_4  
from abc

谁能指导我如何在 python 脚本中转换它? 提前致谢!

【问题讨论】:

  • 你为什么要这个?
  • 因为我有一个 python 脚本正在清理文件并将其推送到 bigquery ,我想避免使用 SQL 并直接从 python 脚本获取更新的数据。

标签: python sql python-3.x pandas dataframe


【解决方案1】:

您可以将代码概括为任意数量的列,如下所示:

for i in range(1, len(df.columns)):
    df['L_' + str(i+1)] = df[df.columns[:i+1]].fillna('emp').agg('|'.join, axis=1)

输出:

>>> print(df)
   D_1   D_2     D_3 D_4       L_2              L_3                  L_4
0  Boy                     Boy|emp      Boy|emp|emp      Boy|emp|emp|emp
1  Boy  play              Boy|play     Boy|play|emp     Boy|play|emp|emp
2  Boy  play     car      Boy|play     Boy|play|car     Boy|play|car|emp
3  Boy  play   chess      Boy|play   Boy|play|chess   Boy|play|chess|emp
4  Boy  play  online      Boy|play  Boy|play|online  Boy|play|online|emp

整个代码:

import pandas as pd
from io import StringIO

txt = '''D_1  D_2   D_3    D_4
Boy                 
Boy  play       
Boy  play  car      
Boy  play  chess    
Boy  play  online
'''

df = pd.read_csv(StringIO(txt), header=0, skipinitialspace=True, sep=r'\s+')

for i in range(1, len(df.columns)):
    df['L_' + str(i+1)] = df[df.columns[:i+1]].fillna('emp').agg('|'.join, axis=1)

df = df.fillna('')

print(df)

【讨论】:

  • 谢谢,快速修复,但如果您现在看到 DF,我们还有额外的“emp”
  • @sdave 我已经编辑,所以你不会在原始 DataFrame 中得到 'emp'
【解决方案2】:

替换 """emp" 使用 Series.replace() 然后使用 join() 在列上迭代合并列值

df = pd.DataFrame({"D_1":["Boy","Boy","Boy","Girl"],"D_2":["","play","play",""],"D_3":["","","car",""],"D_4":[""]*4})
temp = df.replace([''],'emp')
for c in range(1,len(temp.columns)):
    df[f'L_{c+1}'] = temp[temp.columns[:c+1]].astype(str).apply(lambda x: '|'.join(x), axis=1)
print(df)

    D_1  D_2    D_3   D_4     L_2           L_3              L_4
0   Boy                     Boy|emp     Boy|emp|emp     Boy|emp|emp|emp
1   Boy  play               Boy|play    Boy|play|emp    Boy|play|emp|emp
2   Boy  play   car         Boy|play    Boy|play|car    Boy|play|car|emp
3   Girl                    Girl|emp    Girl|emp|emp    Girl|emp|emp|emp

【讨论】:

  • 谢谢,我使用了您之前的解决方案,即您在编辑之前使用的解决方案,因为我想定义要使用的列。在真正的 DF 中,我有更多的列,我不想在这里包括,所以你以前的解决方案对我来说效果很好:)
猜你喜欢
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多