我有一個像這樣的熊貓資料框:
id year_group category
0 8300 1 low
1 8300 2 medium
2 11725 1 low
3 11725 2 low
4 18068 1 medium
... ... ... ...
59354 18962 1 low
59355 11669 1 low
59356 13110 3 low
59357 2378 1 low
59358 19363 1 low
[59359 rows x 3 columns]
我試圖根據一年(year_group 列)確定有多少 id 從一個類別轉移到另一個類別。例如,對于 ID 8300,??從第 1 年到第 2 年的轉變顯示類別從低到中(按該順序)的變化。我想計算每個類別在 year_groups 1 到 3 之間發生的次數。
我不知道如何完成這個。目前我已經考慮在嘗試對所有內容進行分組之前洗掉每個 year_group 并制作單獨的資料框,如下所示:
# year 1 and 2
years_1_2 = df.drop(df[df.year_group == 3].index)
但是,我不知道如何確保分組基于 year_groups 的位置,即第 1 年到第 2 年而不是第 2 年到第 1 年。
也許我可以做一些更精簡的事情。也許利用 np.where... 關于如何最好地解決這個問題的任何建議?
uj5u.com熱心網友回復:
也許這可以讓你開始。這有點冗長,但我相信很清楚。行內評論
# added and modified data for just 2 years
data=''' id year_group category
0 8300 1 low
1 8300 2 medium
2 11725 1 low
3 11725 2 low
4 18068 1 medium
5 18068 2 low
6 18962 1 low
7 18962 2 low
8 21 1 low
9 21 2 medium'''
df = pd.read_csv(io.StringIO(data), sep=' \s ', engine='python')
# sort to keep ids and year_groups ascending
df.sort_values(['id', 'year_group'], ascending=[True, True], inplace=True)
id year_group category
8 21 1 low
9 21 2 medium
0 8300 1 low
1 8300 2 medium
2 11725 1 low
3 11725 2 low
4 18068 1 medium
5 18068 2 low
6 18962 1 low
7 18962 2 low
# if you have year 3, this will only take years 1 and 2
# if a grouping has a count of 2, that means there is no change from one year to the next, so drop everything that didn't change
dft = df[df[df['year_group'] != 3].groupby(['id', 'category'])['year_group'].transform('count') < 2]
id year_group category
8 21 1 low
9 21 2 medium
0 8300 1 low
1 8300 2 medium
4 18068 1 medium
5 18068 2 low
# making lists that show movement from low - medium, medium - low, etc...
yearlychanges = dft.groupby('id')['category'].apply(list).reset_index()
id category
0 21 [low, medium]
1 8300 [low, medium]
2 18068 [medium, low]
# convert lists to strings for counting
yearlychanges['changes'] = yearlychanges.apply(lambda x: '-'.join(x['category']), axis=1)
id category changes
0 21 [low, medium] low-medium
1 8300 [low, medium] low-medium
2 18068 [medium, low] medium-low
# count number of changes
yearlychanges[['changes', 'id']].groupby('changes').count()
id
changes
low-medium 2
medium-low 1
uj5u.com熱心網友回復:
如果我理解正確的話:
Setup
df = pd.DataFrame(data={{'id': [8300, 8300, 8300, 8301, 8301, 8301], 'year_group': [1, 2, 3, 1, 2, 3], 'category': ['low', 'medium', 'low', 'low', 'medium', 'low']}})
Code
df['shift'] = df.groupby('id')['category'].apply(lambda x: x ' ' x.shift(-1))
shifts = df.dropna(subset=['shift']).groupby(['shift']).size()
Input
id year_group category
0 8300 1 low
1 8300 2 medium
2 8300 3 low
59355 8301 1 low
59356 8301 2 medium
59357 8301 3 low
Output:
shift
low medium 2
medium low 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/322017.html
上一篇:如何獲取二維陣列,然后獲取每一行并將其折疊到最大數字的索引中?
下一篇:串列元組表示
