[英]Adding columns to dataframe that show boolean based on column data type in python
[英]Python Dataframe Merge Boolean Columns Data into One Column Data
我有一個包含多列的數據框。 我想將列合並為一列數據。
我的代碼:
df =
A foo goo
0 10 Y NaN
1 40 NaN Y
2 80 Y NaN
預期答案:
df =
A Group
0 10 foo
1 40 goo
2 80 foo
我的做法:
df['foo'].replace('Y','foo',inplace=True)
df['goo'].replace('Y','goo',inplace=True)
df['Group'] = df['foo']+df['goo']
df =
A foo goo Group
0 10 foo NaN NaN
1 40 NaN goo NaN
2 80 foo NaN NaN
在我的回答中,所有元素都變成了 NaN。
我們可以在axis=1
上試試idxmax
df['Group'] = df.drop('A', 1).eq('Y').idxmax(1)
A foo goo Group
0 10 Y NaN foo
1 40 NaN Y goo
2 80 Y NaN foo
用melt
試試
out = df.melt('A',var_name = 'Group').loc[lambda x : x['value']=='Y']
Out[23]:
A Group value
0 10 foo Y
2 80 foo Y
4 40 goo Y
dataframe:
df = pd.DataFrame({'A': [10, 40, 80],
'foo': ['Y', 'NaN', 'Y'],
'goo': ['Nan', 'Y', 'NaN']})
代碼:
def func(row):
return 'foo' * (row['foo'] == 'Y') + 'goo' * (row['goo'] == 'Y')
df['Group'] = df.apply(lambda row: func(row), axis=1)
df.drop(['foo', 'goo'], axis=1)
結果:
A Group
0 10 foo
1 40 goo
2 80 foo
這種方法的優點是你可以玩弄 func 邏輯並為自己定制它。 例如,您可能會遇到foo
和goo
都不是Y
的情況。 在我的解決方案中,它返回0
但您可以自己定義它。
添加另外2個選項:
通過dot
:
df['Group'] = df.set_index('A').isna().dot(df.columns[1:]).values
# df['Group'] = df.drop('A' , 1).isna().dot(df.columns[1:]).values
通過stack
:
df = df.set_index('A').stack().reset_index().drop(0, axis =1).rename(columns = {'level_1': 'Group'})
這么晚才看到。 另一種方法是;
s=df[['foo','goo']].notna()
df['group']=s.agg(lambda x: x.index[x].values,axis=1).str.join(',')
A foo goo group
0 10 Y NaN foo
1 40 NaN Y goo
2 80 Y NaN foo
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.