【问题标题】:Multiple data frames contains one same column多个数据框包含一个相同的列
【发布时间】:2021-11-29 03:04:25
【问题描述】:

我试图在同一列 (accident_no) 的基础上合并 7 个不同的数据帧,但问题是某些数据帧包含更多行和 (accident_no) 的重复,例如

表 1(事故)包含 200 个事故_no(所有唯一),表 3 包含 196 个事故_no(所有唯一),但表 4(人员)包含 400 个事故_no(一些重复),因为可能有多名乘客参与了同一次撞车事故所以accident_no 是一样的,信息可以用于分析。

我面临的问题是我尝试过 concat、join、merge 但答案达到了最高行数,而且我得到的行数超过了 400。

到目前为止,我尝试了以下方法:

dfs = [df1,df2,df3,df5,df6,df7]
df_final = reduce(lambda left,right: pd.merge(left,right,on='ACCIDENT_NO', how = 'left'), dfs)

dfs = [df.set_index(['ACCIDENT_NO']) for df in [df1, df2, df3, df4, df5, df6, df7]]

print(pd.concat(dfs, axis=1).reset_index())

那么,我是否有可能获得超过 400 行的行数,或者我做错了什么?

谢谢

【问题讨论】:

  • 您是否在所有数据框中捕获唯一的人?还是只适用于表 4?

标签: python dataframe merge concatenation


【解决方案1】:

考虑在每个数据框中创建一个包含groupby().cumcount() 的人员计数列,然后连接人员和事故标识符:

dfs = [
    (df.assign(
        PERSON_NO = lambda x: x.groupby(["ACCIDENT_NO"]).cumcount().add(1)
       ).set_index(["PERSON_NO", "ACCIDENT_NO"])
    )
    for df in [df1, df2, df3, df4, df5, df6, df7]
]

final_df = pd.concat(dfs, axis=1).reset_index()

【讨论】:

  • 感谢您的回复,上面的语句将所有 dfs 连接在一起,并用 NaN 替换空行,这使我处于很多列都用 NaN 的情况,我无法用平均或最常见的替换它因为 NaN 数超过 50%。
  • 您问的是不同的问题吗?此解决方案是否解决了上述将数据帧水平合并到最大行而不复制 ACCIDENT_NO 的问题?关于列中 NaN 的插补,请考虑提出一个新问题,以避免偏离本文并混淆未来的读者。请务必包含reproducible example,因为不清楚任何数据框包含什么或您想要的结果。
【解决方案2】:

你可以试试;

table1 = table1.merge(table2,on = ['accident_no'],how = 'left')

并尝试其他表。

【讨论】:

  • 这会合并表格,但是当我尝试与其他 5 个数据框合并时,数据超过了最大数量
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2022-10-04
相关资源
最近更新 更多