【问题标题】:Merging Two Rows (one with a value, the other NaN) in Pandas在 Pandas 中合并两行(一个有值,另一个是 NaN)
【发布时间】:2017-12-01 15:04:14
【问题描述】:

我知道之前有人问过类似的问题(How to merge two rows in a dataframe pandas 等),但我仍在努力做以下事情(除了具有多行的 pandas 数据框):

    team_token  day1    day2   day3  day4
0   abc          1      NaN     NaN   NaN
1   abc          NaN     1      NaN   NaN
2   abc          NaN     NaN    NaN    NaN
3   abc          NaN     NaN    NaN     1

我想将具有相同 team_token 的行组合起来,以便最终结果如下所示:

    team_token  day1    day2  day3  day4
0   abc           1      1    NaN     1

提前谢谢你。

【问题讨论】:

  • 把你的代码,你已经尝试过的@cgp25
  • 我尝试了 df.combine_first,但无济于事
  • 您要删除 NaN 值吗?
  • 不,他们可以留下@HardikSondagar

标签: python pandas


【解决方案1】:

在数据框的两行给出的两个Series 上使用combine_first

import pandas as pd
df = pd.DataFrame({'team_token':['abc', 'abc'], 'day1': [1, None], 'day2' : [None, 1]})

df.loc[0].combine_first(df.loc[1])

给予:

 team_token  day1    day2
0   abc           1       1 

#编辑: 一个更好的解决方案也适用于您的更新答案:

df.max()

假设您的 day 列包含 Nan 或 one。

如果你有不同的team_tokens:

   day1  day2  day3 team_token
0   1.0   NaN   NaN        abc
1   NaN   NaN   NaN        abc
2   1.0   1.0   NaN        abc
3   NaN   NaN   NaN        abc
4   1.0   NaN   1.0        ddd
5   1.0   NaN   1.0        ddd
6   NaN   NaN   1.0        ddd

您可以group_by 并仍然采取该组的max

df.groupby('team_token').max().reset_index()

#  team_token  day1  day2  day3
#0        abc   1.0   1.0   NaN
#1        ddd   1.0   NaN   1.0

【讨论】:

  • 我会努力的!我现在意识到我的 1s 实际上是字符串,所以将修复并尝试上述方法,这应该可以!谢谢!
  • 酷!很高兴听到这个
【解决方案2】:

如果每个team_token只有一个非NaN值,可以使用groupby/sum

df.groupby('team_token')['day1', 'day2'].sum().reset_index()

你得到

    team_token  day1    day2
0   abc         1.0     1.0

【讨论】:

    【解决方案3】:

    也许,不是最短的解决方案,但恕我直言更灵活。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'team_token':['abc', 'abc', 'abc', 'abc'], 
                       'day1': [1, None, None, None], 
                       'day2': [None, 1, None, None],
                       'day3': [None, None, None, None],
                       'day4': [None, None, None, 1]})
    df
    

    def replace_nan_func(x):
        x = x[~pd.isna(x)]
        if len(x) > 0:
            return x.iloc[0]
        else:
            return np.NaN
    
    df_valid = df.groupby(by='team_token').agg(dict.fromkeys(df.columns[1:], replace_nan_func))
    df_valid
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      相关资源
      最近更新 更多