我有一个像这样的数据帧'df' -
Id v1 v2
0 A 0.23
1 B 0.65
2 NaN 0.87
Run Code Online (Sandbox Code Playgroud)
如果我使用
df1 = get_dummies(df)
df1
Run Code Online (Sandbox Code Playgroud)
我明白了
Id v1_A v1_B v2
0 1 0 0.23
1 0 1 0.65
2 0 0 0.87 .
Run Code Online (Sandbox Code Playgroud)
如何有效地获得以下内容?
Id v1_A v1_B v2
0 1 0 0.23
1 0 1 0.65
2 NaN NaN 0.87 .
Run Code Online (Sandbox Code Playgroud)
我最初使用它,但它需要太长时间
import numpy as np
dfv1 = df[[v1]] #Slicing the v1 column
dfs = get_dummies(dfv1)
dfsum = dfs.apply(np.sum, axis=1) #Calculating row by row sum of dfs
for i in range(dfs.size): #Iterating over the entire dataframe
if dfsum.iloc[i]==0: #and if the sum is zero for some 'i'
dfs.iloc[i][:]==np.nan #changing corresponding row to NaN
del df['v1'] #Deleting original column
df = pandas.concat([df, dfs], axis=1) #Appending the new one
Run Code Online (Sandbox Code Playgroud)
我在Jupyter和Pandas 0.18上使用Python 3.5.1.谢谢.
DSM*_*DSM 10
方法#1将v1直接使用'sans,没有循环:
>>> df1 = pd.get_dummies(df)
>>> df1.loc[df.v1.isnull(), df1.columns.str.startswith("v1_")] = np.nan
>>> df1
Id v2 v1_A v1_B
0 0 0.23 1.0 0.0
1 1 0.65 0.0 1.0
2 2 0.87 NaN NaN
Run Code Online (Sandbox Code Playgroud)
方法#2将使用dummy_na参数来获取我们可以使用的列:
>>> df1 = pd.get_dummies(df, dummy_na=True)
>>> df1
Id v2 v1_A v1_B v1_nan
0 0 0.23 1.0 0.0 0.0
1 1 0.65 0.0 1.0 0.0
2 2 0.87 0.0 0.0 1.0
>>> df1.loc[df1.v1_nan == 1, ["v1_A", "v1_B"]] = np.nan
>>> del df1["v1_nan"]
>>> df1
Id v2 v1_A v1_B
0 0 0.23 1.0 0.0
1 1 0.65 0.0 1.0
2 2 0.87 NaN NaN
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3237 次 |
| 最近记录: |