pandas 有没有办法从多个列返回 Dataframe 中的值(日期)?

5gfr0r5j  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(140)

目前,我正尝试根据多列值将日期返回到另一列,如下面的 Dataframe 所示。预期结果是在列df['return_date']中,它返回的日期早于另一列以'1'开始的值
| 日期|色谱柱_a|色谱柱_b|色谱柱_c|色谱柱_d|返回日期|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 2023年1月1日|无|无|1个|无|钠氮|
| 二〇二三年二月一日|无|无|1个|无|钠氮|
| 2023年3月1日|无|无|1个|无|2023年3月1日|
| 2023年4月1日|无|1个|无|无|钠氮|
| 2023年5月1日|无|1个|无|无|钠氮|
| 2023年6月1日|无|1个|无|无|钠氮|
| 2023年7月1日|无|1个|无|无|2023年7月1日|
| 2023年8月1日|1个|无|无|无|钠氮|
| 2023年9月1日|1个|无|无|无|2023年9月1日|
| 2023年10月1日|无|无|无|1个|钠氮|
我想学习使用groupby的多列,但我还不太熟悉它..有人可以帮助我吗?

fruv7luv

fruv7luv1#

这对你的情况应该有效。你需要检测一行相对于下一行的变化,然后在那一行你应该分配日期。

data = {'DATE': {0: '1/1/2023',
  1: '2/1/2023',
  2: '3/1/2023',
  3: '4/1/2023',
  4: '5/1/2023',
  5: '6/1/2023',
  6: '7/1/2023',
  7: '8/1/2023',
  8: '9/1/2023',
  9: '10/1/2023'},
 'column_a': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 1, 8: 1, 9: 0},
 'column_b': {0: 0, 1: 0, 2: 0, 3: 1, 4: 1, 5: 1, 6: 1, 7: 0, 8: 0, 9: 0},
 'column_c': {0: 1, 1: 1, 2: 1, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0},
 'column_d': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 1}}

df = pd.DataFrame.from_dict(data)
row_change = df.filter(like='column').diff(-1).eq(-1).any(axis=1)
df.loc[row_change, 'return_date'] = df.loc[row_change, 'DATE']
lhcgjxsq

lhcgjxsq2#

您可以使用groupby,结合使用.cumcount()来获得所需的索引,然后使用该索引从DATE列拖动日期。

代码:

import pandas as pd

df = pd.DataFrame({
    'DATE': ['1/1/2023', '2/1/2023', '3/1/2023', '4/1/2023', '5/1/2023', '6/1/2023', '7/1/2023', '8/1/2023', '9/1/2023', '10/1/2023'],
    'column_a': [0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
    'column_b': [0, 0, 0, 1, 1, 1, 1, 0, 0, 0],
    'column_c': [1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
    'column_d': [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
})

idx = df[df.groupby(['column_a', 'column_b', 'column_c', 'column_d']).cumcount() == 0].index - 1
df.loc[idx[1:], 'return_date'] = df.loc[idx[1:], 'DATE']

print(df)

输出

DATE  column_a  column_b  column_c  column_d return_date
0   1/1/2023         0         0         1         0         NaN
1   2/1/2023         0         0         1         0         NaN
2   3/1/2023         0         0         1         0    3/1/2023
3   4/1/2023         0         1         0         0         NaN
4   5/1/2023         0         1         0         0         NaN
5   6/1/2023         0         1         0         0         NaN
6   7/1/2023         0         1         0         0    7/1/2023
7   8/1/2023         1         0         0         0         NaN
8   9/1/2023         1         0         0         0    9/1/2023
9  10/1/2023         0         0         0         1         NaN

相关问题