根据公共字段将两行合并为一

时间:2020-01-21 11:51:10

标签: python pandas

我的数据框包含以下数据:

+----------+------------+-------------+---------------+----------+
|id        |name        |predicted    |actual         |yyyy_mm_dd|
+----------+------------+-------------+---------------+----------+
|       215|     NirPost|         null|100.10023      |2020-01-10|
|      null|     NirPost|        57145|null           |2020-01-10|
+----------+------------+-------------+---------------+----------+

我想基于name将这两行合并为一。此df是查询的结果,我只限于一家公司和一天。在实际数据集中,有70多家公司每天提供数据。我想将此数据作为单行重写到新表中。

这是我想要的输出:

+----------+------------+-------------+---------------+----------+
|id        |name        |predicted    | actual        |yyyy_mm_dd|
+----------+------------+-------------+---------------+----------+
|       215|     NirPost| 57145       |100.10023      |2020-01-10|
+----------+------------+-------------+---------------+----------+

我已经尝试过了:

df.replace('null','').groupby('name',as_index=False).agg(''.join)

但是,这将输出我的原始df,但使用NaN而不是null

`df.dtypes`:

id          float64
name        object
predicted   float64
actual      float64
yyyy_mm_dd  object
dtype:      object

1 个答案:

答案 0 :(得分:2)

您如何通过groupby显式传递max中的所有列,以消除空值?

import pandas as pd
import numpy as np
data = {'id':[215,np.nan],'name':['nirpost','nirpost'],'predicted':[np.nan,57145],'actual':[100.12,np.nan],'yyyy_mm_dd':['2020-01-10','2020-01-10']}
df = pd.DataFrame(data)

df = df.groupby('name').agg({'id':'max','predicted':'max','actual':'max','yyyy_mm_dd':'max'}).reset_index()
print(df)

返回:

      name     id  predicted  actual  yyyy_mm_dd
0  nirpost  215.0    57145.0  100.12  2020-01-10

当然,由于您拥有更多的数据,您可能应该考虑在groupby中添加其他内容,以免删除太多的行,但是对于您提供的示例数据,我相信这是解决以下问题的一种方法问题。

编辑:

如果所有列都被命名为max_original_column_name,那么您可以简单地使用:

df.columns = [x[:-4] for x in list(df)]

借助列表理解功能,您将创建一个列表,该列表将最后4个字符(即_max中每个值(即列名的列表)中的list(df)去除。用df.columns =

分配它