[英]Pandas split column and aggreate result with duplicates in index
我有以下數據幀:
ID Type Value
1 A 311
1 A 223
1 B 1233
2 A 424
2 A 553
3 A 11
3 B 4
3 B 5
我正在嘗試通過拆分“類型”列來聚合“ID”列,這樣每個ID都有自己的行以及類型A和類型B的相應列。在“A”和“B”列中,我想分配第一次出現行中的每個相應值。 如果缺少A或B(或兩者),我想指定NaN。 為了明確這個想法,下面的例子描述了我正在尋找的結果:
ID A B
1 311 1233
2 424 NaN
3 11 4
結果保留A出現的第一個值(忽略A 223的第二個值)。 由於ID 1中沒有B的第二個值,因此它只保留值1233.此邏輯繼續用於其他ID。
我一直試圖使用.pivot
解決這個.pivot
df.pivot(columns="Type",values="Value")
這有助於我分離Type列,這樣我得到:
Type A B
0 311 NaN
1 223 NaN
2 NaN 1233
3 11 4
但是我無法將ID列作為索引傳遞,因為它給出了錯誤:
ValueError: Index contains duplicate entries, cannot reshape
drop_duplicates
,在ID列上使用drop_duplicates
導致數據丟失。 有沒有方便的方法在熊貓中進行這樣的操作?
在轉動之前,您需要先刪除重復項。
df.drop_duplicates(['ID', 'Type']).pivot('ID', 'Type', 'Value')
Type A B
ID
1 311.0 1233.0
2 424.0 NaN
3 11.0 4.0
或者,使用pivot_table
with aggfunc='first'
:
df.pivot_table(index='ID', columns='Type', values='Value', aggfunc='first')
Type A B
ID
1 311.0 1233.0
2 424.0 NaN
3 11.0 4.0
性能
這實際上取決於您的數據和組的數量。 最好是根據自己的數據進行測試。
df_ = df.copy()
df = pd.concat([df_] * 10000, ignore_index=True)
%timeit df.pivot_table(index='ID', columns='Type', values='Value', aggfunc='first')
%timeit df.drop_duplicates(['ID', 'Type']).pivot('ID', 'Type', 'Value')
%timeit df.groupby(['ID', 'Type']).Value.first().unstack(1)
15.2 ms ± 272 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
8.63 ms ± 98 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
8.34 ms ± 246 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
first
使用groupby
df.groupby(['ID','Type']).Value.first().unstack()
Type A B
ID
1 311.0 1233.0
2 424.0 NaN
3 11.0 4.0
或者使用groupby
head
with pivot
df.groupby(['ID','Type'],as_index=False).head(1).pivot('ID', 'Type', 'Value')
Type A B
ID
1 311.0 1233.0
2 424.0 NaN
3 11.0 4.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.