簡體   English   中英

使用Pandas中的多個列創建數據透視表數據框架

[英]Creating Pivot DataFrame using Multiple Columns in Pandas

我在下面的示例中的表單后面有一個pandas數據框:

data = {'id': [1,1,1,1,2,2,2,2,3,3,3], 'a': [-1,1,1,0,0,0,-1,1,-1,0,0], 'b': [1,0,0,-1,0,1,1,-1,-1,1,0]}
df = pd.DataFrame(data)

現在,我想要做的是創建一個數據透視表,這樣對於除id之外的每個列,我將有3個與該值對應的新列。 也就是說,對於列a ,我將創建a_nega_zeroa_pos 同樣,對於b ,我將創建b_negb_zerob_pos 這些新列的值將對應於這些值在原始ab列中出現的次數。 最終的數據框應如下所示:

result = {'id': [1,2,3], 'a_neg': [1, 1, 1],
      'a_zero': [1, 2, 2], 'a_pos': [2, 1, 0],
      'b_neg': [1, 1, 1], 'b_zero': [2,1,1], 'b_pos': [1,2,1]}
df_result = pd.DataFrame(result)

現在,要做到這一點,我可以執行以下步驟並得出我的最終答案:

by_a = df.groupby(['id', 'a']).count().reset_index().pivot('id', 'a', 'b').fillna(0).astype(int)
by_a.columns = ['a_neg', 'a_zero', 'a_pos']

by_b = df.groupby(['id', 'b']).count().reset_index().pivot('id', 'b', 'a').fillna(0).astype(int)
by_b.columns = ['b_neg', 'b_zero', 'b_pos']

df_result = by_a.join(by_b).reset_index()

但是,我認為這種方法並不是最優的,特別是如果除了ab之外我有很多原始列。 是否有更短和/或更有效的解決方案來獲得我想要實現的目標? 謝謝。

一個較短的解決方案,但仍然非常低效:

In [11]: df1 = df.set_index("id")

In [12]: g = df1.groupby(level=0)

In [13]: g.apply(lambda x: x.apply(lambda x: x.value_counts())).fillna(0).astype(int).unstack(1)
Out[13]:
    a        b
   -1  0  1 -1  0  1
id
1   1  1  2  1  2  1
2   1  2  1  1  1  2
3   1  2  0  1  1  1

注意:我認為你應該針對多索引列。


我有理由相信我已經看到了一個刪除apply / value_count / fillna的技巧,其中包含更清潔,更高效的東西,但此刻它讓我無法...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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