簡體   English   中英

Python Pandas:為源列的每個不同值創建一個新列(使用布爾輸出作為列值)

[英]Python Pandas: create a new column for each different value of a source column (with boolean output as column values)

我試圖根據內容在幾列中拆分數據框的源列,然后按照以下方式用布爾值1或0填充這些新生成的列:

原始數據幀:

ID   source_column
A    value 1
B    NaN
C    value 2
D    value 3
E    value 2

生成以下輸出:

ID   source_column    value 1    value 2    value 3
A    value 1          1          0          0
B    NaN              0          0          0
C    value 2          0          1          0
D    value 3          0          0          1
E    value 2          0          1          0

我想過手動創建每個不同的列,然后使用每個列的函數和.apply,用1或0填充新列,但這是非常無效的。

有一種快速有效的方法嗎?

你可以試試:

df = pd.get_dummies(df, columns=['source_column'])

或者如果你喜歡sklearn

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
matrix=enc.fit_transform(df['source_column'])

您可以使用pandas函數get_dummies,並將結果添加到df,如下所示

In [1]: col_names = df['source_column'].dropna().unique().tolist()

In [2]: df[col_names] = pd.get_dummies(df['source_column'])

In [3]: df
Out[3]: 
  ID source_column  value 1  value 2  value 3
0  A       value 1        1        0        0
1  B          NaN         0        0        0
2  C       value 2        0        1        0
3  D       value 3        0        0        1
4  E       value 2        0        1        0

所以有這種可能性(有點hacky)。

從示例數據中讀取DataFrame:

In [4]: df = pd.read_clipboard().drop("ID", axis=1)

In [5]: df
Out[5]:
   source_column
A            1.0
B            NaN
C            2.0
D            3.0
E            2.0

之后,添加一個df['foo'] = 1的新列。

然后使用取消堆棧

In [22]: df.reset_index().set_index(['index', 'source_column']).unstack().fillna(0).rename_axis([None]).astype(int)
Out[22]:
              foo
source_column NaN 1.0 2.0 3.0
A               0   1   0   0
B               1   0   0   0
C               0   0   1   0
D               0   0   0   1
E               0   0   1   0

然后,您當然必須重命名您的列並刪除Nan col,但這應該在第一次運行時滿足您的需求。

編輯:

其他抑制nan列的方法,你可以使用groupby + value_counts(hacky也是如此):

In [30]: df.reset_index().groupby("index").source_column.value_counts().unstack().fillna(0).astype(int).rename_axis([None])
Out[30]:
source_column  1.0  2.0  3.0
A                1    0    0
C                0    1    0
D                0    0    1
E                0    1    0

這是相同的想法(取消堆疊)但是抑制了默認情況下要考慮的nan值。 您當然必須將其合並到原始數據框上,以便在需要時保留具有nan值的行。 所以,兩種方法都可以正常工作,您可以選擇最能滿足您需求的方法。

pd.concat([df,pd.crosstab(df.index,df.source_column)],1).fillna(0)

Out[1028]: 
  ID source_column  value1  value2  value3
0  A        value1     1.0     0.0     0.0
1  B             0     0.0     0.0     0.0
2  C        value2     0.0     1.0     0.0
3  D        value3     0.0     0.0     1.0
4  E        value2     0.0     1.0     0.0

暫無
暫無

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

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