簡體   English   中英

Python Dataframe 合並 Boolean 列數據為一列數據

[英]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 邏輯並為自己定制它。 例如,您可能會遇到foogoo都不是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.

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