我的数据框包含以下数据:
+----------+------------+-------------+---------------+----------+
|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
答案 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 =