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

yuvru6vn  于 2024-01-08  发布在  其他
关注(0)|答案(1)|浏览(217)

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

  1. import numpy as np
  2. import pandas as pd
  3. data = {
  4. 'Customer': ['A', 'B', 'C'],
  5. 'Date1': [10, 20, 30],
  6. 'Date2': [40, 50, np.nan],
  7. 'Date3': [np.nan, np.nan, np.nan],
  8. 'Date4': [60, np.nan, np.nan]
  9. }
  10. df = pd.DataFrame(data)
  11. out = (df
  12. .set_index('Customer', append=True)
  13. .pipe(lambda d: d.mask(d.iloc[:, -1].isna(),
  14. d.transform(lambda x : sorted(x, key=pd.notnull), axis=1)
  15. )
  16. )
  17. .reset_index('Customer')
  18. )

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

7cjasjjr

7cjasjjr1#

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

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

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

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

展开查看全部

相关问题