python 如何水平折叠Pandas Dataframe ?

o2gm4chl  于 2022-11-21  发布在  Python
关注(0)|答案(4)|浏览(188)

我有下面的布尔值表:

df1 = pd.DataFrame(data={'w': [True, False, False], 
                         'x': [False, True, False],
                         'y': [True, True, True],
                         'z': [True, False, True]},
                         index=pd.Series([1, 2, 3], name='index'))

| 索引|w型|X射线|Y形|Z轴|
| - -|- -|- -|- -|- -|
| 一个|正确|错误|正确|正确|
| 2个|错误|正确|正确|错误|
| 三个|错误|错误|正确|正确|
我创建了一个宽度与df1相同的新表格:

pd.DataFrame(columns=[f'column{num}' for num in range(1, len(df1.columns) + 1)])

| | 栏1|栏2|第3栏|第4栏|
| - -|- -|- -|- -|- -|
我想做的是从df1开始折叠列,这样对于每一行,我只显示具有True值的列:
| 索引|栏1|栏2|第3栏|第4栏|
| - -|- -|- -|- -|- -|
| 一个|w型|Y形|Z轴|不适用|
| 2个|X射线|Y形|不适用|不适用|
| 三个|Y形|Z轴|不适用|不适用|

rekjcdws

rekjcdws1#

dotstr.split的单向:

import numpy as np

df2 = df1.dot(df1.columns+",")
         .str.split(",", expand=True)
         .replace(r'^\s*$', np.nan, regex=True)
         .rename_axis(None)
df2.columns = [f'column{num}' for num in range(1, len(df2.columns)+1)]

>>> df2

    column1 column2 column3 column4
1         w       y       z     NaN
2         x       y     NaN     NaN
3         y       z     NaN     NaN
ubbxdtey

ubbxdtey2#

请尝试:

out = np.full(df1.shape, np.nan, dtype='object')

# mask valid columns for each row
mask = np.arange(df1.shape[1]) < df1.sum(1).values[:,None]

out[mask] = np.where(df1, df1.columns, np.nan)[df1]

out = pd.DataFrame(out)
col17t5w

col17t5w3#

您可以先使用特殊乘法(True -〉1,1 *'w' -〉'w' / False -〉0,0 *'w' -〉'')将列名Map到单元格
然后使用自定义键对行进行独立排序(isinstance(w, float)将在末尾推送NaN/float)

cols = [f'column{num}' for num in range(1, len(df1.columns) + 1)]
(df1*df1.columns).where(df1).apply(lambda r: pd.Series(sorted(r, key=lambda x: isinstance(x, float)),
                                                       index=cols), axis=1)

输出:

column1 column2 column3  column4
index                                 
1           w       y       z      NaN
2           x       y     NaN      NaN
3           y       z     NaN      NaN
nbnkbykc

nbnkbykc4#

在您的情况下,执行dot,然后执行split

out = df.dot(df.columns+',').str[:-1].str.split(',',expand=True).reindex(columns= np.arange(df.shape[1]))
Out[34]: 
       0  1     2   3
index                
1      w  y     z NaN
2      x  y  None NaN
3      y  z  None NaN

相关问题