我是 python 新手,我可以在正確的方向上推動我認為應該是(?)一個非常簡單的問題。我有一個包含一列的資料框(genres_df):
0
0 Horror
1 Comedy
2 Fantasy
3 Adventure
4 Drama
5 Animation
6 Crime
...
和一個包含 3 列的資料框(df)——與電影相關的每種型別一個,我正在看的每部電影一個行):
0 1 2
0 Horror Short None
1 Horror Short None
2 Comedy Horror Short
3 Comedy Horror Short
4 Fantasy Horror Short
...
我想計算包含genres_df 中每個專案的資料幀型別中的行數。我可以通過一條總和線手動完成此操作:
sum(df[0] == 'Comedy') sum(df[1] == 'Comedy') sum(df[2] == 'Comedy')
我知道這行得通,因為每一行都有一個恐怖專案,而 df 中有 78471 行。
我想獲得一個包含兩列的資料框:流派(來自genres_df)和該流派出現的行數,跨越df中的任何列。像這樣
0 1
0 Horror 78471
1 Comedy 9903
...
這是我到目前為止所得到的:
df_counts = pd.DataFrame(columns = ['genre','count'])
for i in genres_df[0]:
s_row = pd.Series(i,sum(df[0]==i) sum(df[1]==i) sum(df[2]==i))
df_counts.append(s_row,ignore_index=True)
但這不起作用。不過,這似乎是我得到的最接近的。幫助?
uj5u.com熱心網友回復:
我認為你需要做的是以下
- 融化你的資料框(即將列變成行)
- 應用 groupby 操作和計數
最后。
- 使用您的第一個 df 中的流派過濾流派列
df1 = pd.melt(df,value_name='genre').groupby('genre',
as_index=False).agg(count=('genre','count'))
print(df1)
genre count
0 Comedy 2
1 Fantasy 1
2 Horror 5
3 None 2
4 Short 5
final = df1[df1['genre'].isin(all_genre['0'])]
genre count
0 Comedy 2
1 Fantasy 1
2 Horror 5
作為旁注 - 如果您使用 pandas API 之外的方法,那么您很可能做錯了事情(如違反庫的設計)
uj5u.com熱心網友回復:
我認為您的解決方案是正確的,但append與任何其他熊貓操作一樣,默認情況下不會改變資料框,因此您必須重新分配它(或使用inplace=True)
df_counts = pd.DataFrame(columns = ['genre','count'])
for i in genres_df[0]:
s_row = pd.Series(i,sum(df[0]==i) sum(df[1]==i) sum(df[2]==i))
df_counts = df_counts.append(s_row,ignore_index=True)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/427010.html
