亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何合并 pandas 中的行以獲得無序的列對?

如何合并 pandas 中的行以獲得無序的列對?

楊__羊羊 2023-10-26 16:57:28
我的數據框中的行如下-     Team 1          Team 2         Winner       winner_count0   Afghanistan     Australia     Australia             119    Australia   Afghanistan     Australia             1我想將這兩行合并為一行并對 Winner_count 求和,這樣 -     Team 1          Team 2         Winner       winner_count0   Afghanistan     Australia     Australia             2這應該是我的輸出。
查看完整描述

3 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

如果數據框中有很多行,我會盡量避免使用傳遞axis=1.?


s1 = np.where(df['Team 2'] > df['Team 1'], df['Team 1'], df['Team 2'])

s2 = np.where(df['Team 2'] < df['Team 1'], df['Team 1'], df['Team 2'])

df['Team 1'] = s1

df['Team 2'] = s2

df = df.groupby(['Team 1', 'Team 2', 'Winner'])['winner_count'].sum().reset_index()

df

Out[1]:?

? ? ? ? Team 1? ? ?Team 2? ? ?Winner? winner_count

0? Afghanistan? Australia? Australia? ? ? ? ? ? ?2


查看完整回答
反對 回復 2023-10-26
?
MYYA

TA貢獻1868條經驗 獲得超4個贊

試穿這款尺碼:


import pandas as pd


# Initialise test dataframe

df = pd.DataFrame({'Team 1': ['A', 'B'], 'Team 2': ['B', 'A'], 'winner_count': [1, 1]})


# Get the smallest team name (alphabetically)

df['First'] = df[['Team 1', 'Team 2']].min(axis=1)


# Get the largest team name (alphabetically)

df['Second'] = df[['Team 1', 'Team 2']].max(axis=1)


# Groupby the teams to sum winner_counts

df = df[['First', 'Second', 'winner_count']].groupby(['First', 'Second']).sum().reset_index()

這似乎是一個效率低下的解決方案,所以看看其他人是否想出更好的方法。


查看完整回答
反對 回復 2023-10-26
?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

IMO 該解決方案應該處理數據框中有兩個以上團隊的可能性,例如:


df = pd.DataFrame({"Team1": ["Afghanistan", "Australia", "Australia", "Belgium", "Afghanistan"],

                   "Team2": ["Australia", "Afghanistan", "Afghanistan", "Afghanistan","Belgium"],

                   "Winner": ["Afghanistan", "Australia", "Australia", "Afghanistan", "Afghanistan"],

                   "winner_count": [1, 1, 1, 1, 1]

                   })

我首先會通過新的“團隊”列來識別每個團隊組合:


df.loc[:,"Teams"] = df.apply(lambda x: ", ".join(sorted([x["Team1"],x["Team2"]])), axis=1)

然后可以按團隊組合進行分組,并將獲勝團隊放在每個組的頂部:


group = df.groupby(by=["Teams","Winner"]).agg({

    "Teams":"first",

    "Team1":"first",

    "Team2":"first",

    "winner_count":"sum"}).sort_values(by=["winner_count"], ascending=False)

IMO 已經有了“團隊”列,兩個團隊中哪一個是團隊 1 或團隊 2 并不重要。重復項將被刪除:


group.drop_duplicates(subset="Teams", inplace=True)

還可以通過以下方式刪除 MultiIndex ["Teams", "Winner"]:


group.reset_index(level=1, drop=True, inplace=True)

結果數據框組(沒有索引“Teams”):


+-------------+------------------------+-----------+-------------+--------------+

|   Winner    |         Teams          |   Team1   |    Team2    | winner_count |

+-------------+------------------------+-----------+-------------+--------------+

|             |                        |           |             |              |

| Australia   | Afghanistan, Australia | Australia | Afghanistan |            2 |

| Afghanistan | Afghanistan, Belgium   | Belgium   | Afghanistan |            2 |

+-------------+------------------------+-----------+-------------+--------------+


查看完整回答
反對 回復 2023-10-26
  • 3 回答
  • 0 關注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號