【问题标题】:Combining multiple rows in Python by the same value in Column A在 Python 中通过 A 列中的相同值组合多行
【发布时间】:2020-10-29 01:18:30
【问题描述】:

我希望使用 Python 将 CSV 中的多行数据连接到单行中。每行具有相同的列,但在不同的列中具有空值。最后将其再次导出为 CSV。希望下面的示例有助于阐明我想要完成的任务。

数据示例:

Email                age    city             car
-----------------   -----   --------------   -----
JohnDoe@gmail.com    20     NULL             NULL
JohnDoe@gmail.com    NULL   San Francisco    NULL
JohnDoe@gmail.com    NULL   NULL             Mazda
henry@gmail.com      25     NULL             NULL
henry@gmail.com      NULL   Miami            NULL
henry@gmail.com      NULL   NULL             Honda

预期结果:

Email                age    city             car
-----------------   -----   --------------   -----
JohnDoe@gmail.com    20     San Francisco    Mazda
henry@gmail.com      25     Miami            Honda

【问题讨论】:

  • 有具体问题吗?请提供minimal reproducible example,以及当前输出。
  • @AMC 的问题是,假设对于人 A,有三个事件:PERSON ITEM ------------- ------- - A 25 A Miami A Honda 我设法将每个项目分开到它自己的列中,就像我问题中的数据示例一样。然而,我仍然为 Person A 留下 3 行,但每个项目都放在不同的列中。我想将每个项目放入其各自的列中,但都包含在一行中并将其打印到一个新的 CSV 文件中。基本上将它们合并成一行而不是有 3 个不同的行
  • 请提供minimal reproducible example,通过修改当前程序可能有更简单的解决方法。

标签: python pandas dataframe csv


【解决方案1】:

如果 NULL 为 NaN,则首先对值进行排序并删除 NaN:

df['age'] = df['age'].sort_values().values
df['car'] = df['car'].sort_values().values
df['city'] = df['city'].sort_values().values
df = df.dropna()
print(df)

【讨论】:

  • 为什么是 .values ?另外,你不能在整个DataFrame上调用.sort_values()吗?
  • 我想保持“电子邮件”不变
  • 您是否将 OP 的数据解析为实际的 DF 以进行测试?我懒得自己做,哈哈
  • @AMC 我用不同的 df 测试过,我想给你,但是我已经关闭了 ipython shell
【解决方案2】:

数据文件 tmp.csv:

Email,age,city,car
JohnDoe@gmail.com,20,,
JohnDoe@gmail.com,,San Francisco,
JohnDoe@gmail.com,,,Mazda
henry@gmail.com,25,,
henry@gmail.com,,Miami,
henry@gmail.com,,,Honda

代码:

import numpy as np
import pandas as pd

df = pd.read_csv("tmp.csv", keep_default_na=False)
print(df)
Age = df[['Email', 'age']][df.age.apply(lambda x: x.isnumeric())]
City = df[['Email', 'city']][df['city'].astype(bool)]
Car = df[['Email', 'car']][df['car'].astype(bool)]

dfinal = Age.merge(City, on="Email", how = 'inner')
print(dfinal)
dfinal = dfinal.merge(Car, on="Email", how = 'inner')
print(dfinal)

输出:

               Email age           city    car
0  JohnDoe@gmail.com  20
1  JohnDoe@gmail.com      San Francisco
2  JohnDoe@gmail.com                     Mazda
3    henry@gmail.com  25
4    henry@gmail.com              Miami
5    henry@gmail.com                     Honda
               Email age           city
0  JohnDoe@gmail.com  20  San Francisco
1    henry@gmail.com  25          Miami
               Email age           city    car
0  JohnDoe@gmail.com  20  San Francisco  Mazda
1    henry@gmail.com  25          Miami  Honda

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    相关资源
    最近更新 更多