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