【问题标题】:Python, Pandas dataframe, merge dataframe's rows that have same two column values and aggregate data in rowsPython,Pandas 数据框,合并具有相同两列值的数据框的行并在行中聚合数据
【发布时间】:2021-07-31 00:25:45
【问题描述】:

我有这个 DF,我正在尝试将任意两行与相似的 workDateID 合并。我不知道这个 DF 会有多少列。它可能有数百列,所以我正在寻找一种无需指定所有列名即可合并的方法

    |workDate   |ID       | Hours |Groundsman  |names2  |Teachers       |Profs
---------------------------------------------------------------------------------
0   |2020-01-09 |13702    | 1.0   |   Ted      |        |               |
1   |2020-01-09 |13702    | 1.0   |            |Seline  |               |
2   |2020-01-10 |13702    | 20.0  |            |Ted,Sam |               |
3   |2020-01-10 |13702    | 20.0  |            |        |Pete,Norm,Tim  |
4   |2020-01-10 |13702    | 20.0  |            |        |               |Joe

期望的输出:

    |workDate   |ID       | Hours |Groundsman  |names2  |Teachers       |Profs
---------------------------------------------------------------------------------
0   |2020-01-09 |13702    | 1.0   |   Ted      |Seline  |               |
1   |2020-01-10 |13702    | 20.0  |            |Ted,Sam |Pete,Norm,Tim  |Joe

我尝试了多种分组方式,但都没有得到我想要的输出。正如我提到的 DF 可能有很多其他列,所以我不能使用期望包含所有列名称的解决方案。 它基本上是由workDateID 分组的,但我也想将所有值保留在其他列中

【问题讨论】:

  • 不太清楚你的逻辑是什么。您如何确定为相似的 workDateID 保留哪个值?
  • 它基本上按workDateID 分组,但我也想将所有值保留在其他列中。我希望这是有道理的
  • 我编辑了输出。也许那令人困惑。具有 0 和 1 的第一列只是索引列,我不关心它
  • 在您的示例中:如果 - 而不是第一行和第二行的 hours=1 和 hours=1,您看到 hours=1 和 hours=5,该怎么办?该组将保留哪个值?
  • 这还不够好 - 防御性编程需要假设如果可能发生不好的事情,它会发生。 @MDR 的答案采用最后看到的值,这可能适合您的用例。

标签: python python-3.x pandas dataframe pandas-groupby


【解决方案1】:

试试:

import pandas as pd
import numpy as np #only required because the example df creation needs np.nan

df = pd.DataFrame({'workDate': {0: '2020-01-09',
  1: '2020-01-09',
  2: '2020-01-10',
  3: '2020-01-10',
  4: '2020-01-10'},
 'ID': {0: 13702, 1: 13702, 2: 13702, 3: 13702, 4: 13702},
 ' Hours': {0: 1.0, 1: 1.0, 2: 20.0, 3: 20.0, 4: 20.0},
 'Groundsman': {0: '   Ted', 1: np.nan, 2: np.nan, 3: np.nan, 4: np.nan},
 'names2': {0: np.nan, 1: 'Seline', 2: 'Ted,Sam', 3: np.nan, 4: np.nan},
 'Teachers': {0: np.nan, 1: np.nan, 2: np.nan, 3: 'Pete,Norm,Tim', 4: np.nan},
 'Profs': {0: np.nan, 1: np.nan, 2: np.nan, 3: np.nan, 4: 'Joe'}})

print(df.groupby(by=['workDate', 'ID']).last().reset_index())

输出:

     workDate     ID   Hours Groundsman   names2       Teachers Profs
0  2020-01-09  13702     1.0        Ted   Seline           None  None
1  2020-01-10  13702    20.0       None  Ted,Sam  Pete,Norm,Tim   Joe

【讨论】:

  • 非常感谢!这似乎应该可以工作,但它是否需要/期望初始 DF 中的空单元格具有 nanNone 值才能工作?
  • 回答自己,是的,我用nan 替换了空单元格,这对我有用。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2016-01-06
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
相关资源
最近更新 更多