【问题标题】:How to combine duplicate rows in python pandas如何在python pandas中合并重复的行
【发布时间】:2020-07-24 17:31:00
【问题描述】:

我有一个类似于下面列出的数据框。出于某种原因,每个团队被列出两次,每列对应一个列表。

import pandas as pd
import numpy as np
d = {'Team': ['1', '2', '3', '1', '2', '3'], 'Points for': [5, 10, 15, np.nan,np.nan,np.nan], 'Points against' : [np.nan,np.nan,np.nan, 3, 6, 9]}
df = pd.DataFrame(data=d)




Team    Points for  Points against
0   1        5            Nan
1   2       10            Nan
2   3       15            Nan
3   1       Nan            3
4   2       Nan            6
5   3       Nan            9

我怎样才能将重复的团队名称行合并,从而避免缺失值?这就是我想要的:

 Team   Points for  Points against
0   1        5             3
1   2       10             6
2   3       15             9

我一直在尝试用 pandas 来解决这个问题,但似乎无法理解。谢谢!

【问题讨论】:

  • 这能回答你的问题吗? How to combine duplicate rows in pandas?
  • 只需从您的输入中删除所有 Nans 并删除重复的索引值:d = {'Team': ['1', '2', '3'], 'Points for': [5, 10, 15], 'Points against' : [3, 6, 9]}。或者您是说数据以这种肮脏的格式提供给您,您需要帮助清理它吗?理想情况下,您应该修复产生这些脏数据的任何代码。
  • 不幸的是,由于某些奇怪的原因,数据是这样的。

标签: python pandas numpy dataframe


【解决方案1】:

使用groupby 的一种方式。 :

df = df.replace("Nan", np.nan)
new_df = df.groupby("Team").first()
print(new_df)

输出:

      Points for  Points against
Team                            
1            5.0             3.0
2           10.0             6.0
3           15.0             9.0

【讨论】:

    【解决方案2】:

    您需要groupby 唯一标识符。如果还有游戏 ID 或日期或类似内容,您可能还需要对其进行分组。

    df.groupby('Team').agg({'Points for': 'max', 'Points against': 'max'})
    

    【讨论】:

      【解决方案3】:

      我对您的代码进行了更改,将字符串 'Nan' 替换为 numpy 的 nan。

      一种解决方案是将melt 数据、drop 空条目和pivot 从长返回宽:

      df = (df
            .melt('Team')
            .dropna()
            .pivot('Team','variable','value')
            .reset_index()
            .rename_axis(None,axis='columns')
            .astype(int)
           )
      
      df
      
      
        Team  Points against  Points for
      0   1      3              5
      1   2      6              10
      2   3      9              15
      

      【讨论】:

        【解决方案4】:
        pd.pivot_table(df, values = ['Points for','Points against'],index=['Team'], aggfunc=np.sum)[['Points for','Points against']]
        

        输出

              Points for  Points against
        Team                            
        1            5.0             3.0
        2           10.0             6.0
        3           15.0             9.0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-05
          • 2018-05-06
          • 2018-10-23
          • 2022-11-27
          • 2017-01-06
          • 2019-03-25
          • 2017-12-16
          • 1970-01-01
          相关资源
          最近更新 更多