numpy 根据筛选将行中的实体向右移动?

yuvru6vn  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(151)

如果从@mozway找到一个很好的解决方案,将实体移到列的右边:
Python / Pandas: Shift entities of a row to the right (end)
如果最后一列中有NaN(列数可以变化),我想将所有列右移到数据框的末尾,使其看起来像下面这样:
解决方案运行良好:
x1c 0d1x的数据

import numpy as np
import pandas as pd

data = {
    'Customer': ['A', 'B', 'C'],
    'Date1': [10, 20, 30],
    'Date2': [40, 50, np.nan],
    'Date3': [np.nan, np.nan, np.nan],
    'Date4': [60, np.nan, np.nan]
}

df = pd.DataFrame(data)

out = (df
   .set_index('Customer', append=True)
   .pipe(lambda d: d.mask(d.iloc[:, -1].isna(),
                          d.transform(lambda x : sorted(x, key=pd.notnull), axis=1)
                         )
        )
   .reset_index('Customer')
)

字符串
但是,现有的解决方案是否有一种方法来实现过滤器,即只移动包含例如Customer中的单词main的行?它应该看起来像这样:Cucumber.main被移动,因为单词main。Strawberry.fruit not,因为缺少main。
期望输出:

7cjasjjr

7cjasjjr1#

您可以使用Series.str.containsDataFrame.mask添加新条件:

out = (df
   .set_index('Customer', append=True)
   .pipe(lambda d: d.mask(d.iloc[:, -1].isna() &
                          df['Customer'].str.contains('main').to_numpy(),
                          d.transform(lambda x : sorted(x, key=pd.notnull), axis=1)
                         )
        )
   .reset_index('Customer')
)

字符串
或者使用MultiIndex乘以Index.get_level_values的级别:

out = (df
   .set_index('Customer', append=True)
   .pipe(lambda d: d.mask(d.iloc[:, -1].isna() & 
                          d.index.get_level_values('Customer').str.contains('main'),
                          d.transform(lambda x : sorted(x, key=pd.notnull), axis=1)
                         )
        )
   .reset_index('Customer')
)

相关问题