簡體   English   中英

Pandas拆分列和聚合結果與索引中的重復項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM