【问题标题】:How do I merge multiple rows in Dataframe when some column values are empty?当某些列值为空时,如何合并 Dataframe 中的多行?
【发布时间】:2020-11-27 08:46:47
【问题描述】:

我有这样的数据框:更改了发布标签:您可以看到。 SSN、学生证和驾照将是唯一的。我如何在 Python (PD/NP) 中做到这一点

Name    SSN     Student_ID   DrivingLicenseNumber

Smith   None    1234         DL1234
Smith   None    None         DL1234
Smith   2222    1234         None     
None    2222    None         None     

您可以注意到,对于 Simith,并非所有值都出现在每一行中。我正在尝试为 smith 找到 one 行,如下所示。任何指针将不胜感激。我知道我可以加载到 MySQL 并执行此操作,但无法在 DF 中找到最佳方式。

None    SSN    Student_ID    DrivingLicenseNumber
Smith   2222   1234          DL1234

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

我们可以尝试将每个唯一键映射到其他键。比如这样的双循环:

# map the string `None` to nan if necessary
df = df.mask(df=='None', np.nan)

keys = ['SSN', 'Student_ID','DrivingLicenseNumber']
for k in keys:
    maps = df.dropna(subset=[k]).groupby(k).first()
    for c in keys:
        if c == k: continue
        df[c] = df[c].fillna(df[k].map(maps[c]))

之后,数据框将如下所示:

    Name   SSN Student_ID DrivingLicenseNumber
0  Smith  2222       1234               DL1234
1  Smith  2222       1234               DL1234
2  Smith  2222       1234               DL1234
3    NaN  2222       1234               DL1234

从中,我们可以使用任何唯一键删除重复项:

df.groupby('SSN').first()

【讨论】:

  • 嗨,我正在尝试上述方法 - 但得到 KeyError: ['Name'],我打印了 df 以确保列 'Name' 是第一个(尽管其中有很多 NaN列。
【解决方案2】:

groupby.firstmask 一起使用:

df.mask(df.eq('None')|df.eq(None)).groupby('Name').first()

这里不确定'None' 是字符串还是None。如果您确定可以在掩码中使用条件而不是两者。


你也可以试试:

df = df.mask(df.eq('None')|df.eq(None))
df = df.fillna(df.groupby('SSN').transform('ffill'))
df = df.fillna(df.groupby('Name').transform('ffill'))
df = df.fillna(df.groupby('Student_ID').transform('ffill'))
df = df.groupby('Name').first()

【讨论】:

  • 有趣的是,您没有在唯一键上groupby
  • @QuangHoang 我修好了。
【解决方案3】:

搜索并移动最大索引不为 null 并删除任何包含 null 的列。

 df.apply(lambda x:x.shift(-(x.notna().idxmax()))).dropna(thresh=4)
  
  Name    SSN    Student_ID      DrivingLicenseNumber
0  Smith  2222       1234               DL1234

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2023-04-02
    • 2018-04-06
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多