python - 基于条件的 Pandas DataFrame 重复值

标签 python pandas

我正在尝试根据列中的条件重复 DataFrame 中的行值。如果列 Change = 1 中的值,那么我想重复 A、B 和 C 列中的值,直到下一个 Change = 1。

index = pandas.date_range('20000131', periods=5)
columns = ['A', 'B', 'C', 'Change']

data = {'A': pandas.Series([False, True, False, True, False], index=index)
    , 'B': pandas.Series([True, True, False, False, False], index=index)
    , 'C': pandas.Series([True, False, True, True, True], index=index)
    , 'Change' : pandas.Series([1,0,0,1,0], index=index)}

结果:

                A      B      C  Change
2000-01-31  False   True   True       1
2000-02-01   True   True  False       0
2000-02-02  False  False   True       0
2000-02-03   True  False   True       1
2000-02-04  False  False   True       0

期望的结果:

                A      B      C  Change
2000-01-31  False   True   True       1
2000-02-01  False   True   True       0
2000-02-02  False   True   True       0
2000-02-03   True  False   True       1
2000-02-04   True  False   True       0

这是我使用 shift() 所能获得的最接近的结果,但它只持续一行。我需要它持续 N 行。在下面的示例中,它在第三行(或具有 0 碱基的第二行)中分解。

print pandas.DataFrame(numpy.where(pandas.DataFrame(df['Change']==1)
    , df, df.shift()))

结果:

       0      1      2  3
0  False   True   True  1
1  False   True   True  1
2  False   True  False  0
3   True  False   True  1
4   True  False   True  1

谢谢。

最佳答案

您可以使用 NaN 和 ffill 填充 Change == 0 行:

In [11]: df.loc[df.Change != 1, ['A', 'B', 'C']] = numpy.nan

In [12]: df
Out[12]:
             A   B   C  Change
2000-01-31   0   1   1       1
2000-02-01 NaN NaN NaN       0
2000-02-02 NaN NaN NaN       0
2000-02-03   1   0   1       1
2000-02-04 NaN NaN NaN       0

In [13]: df.ffill()
Out[13]:
            A  B  C  Change
2000-01-31  0  1  1       1
2000-02-01  0  1  1       0
2000-02-02  0  1  1       0
2000-02-03  1  0  1       1
2000-02-04  1  0  1       0

如果您需要将它们作为 bool 列,则在每一列上使用 astype(bool)

顺便说一句,您几乎可以通过重新取样(除了最后缺失的行和已更改的列):

In [14]: df[df.Change == 1].resample('D', fill_method='ffill')
Out[14]:
            A  B  C  Change
2000-01-31  0  1  1       1
2000-02-01  0  1  1       1
2000-02-02  0  1  1       1
2000-02-03  1  0  1       1

关于python - 基于条件的 Pandas DataFrame 重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24215315/

相关文章:

python - 使用 Pygame 进行 Python 游戏时出现游戏结束屏幕问题

python-jenkins 或 jenkinsapi 用于 python 中的 jenkins 远程访问 API

python - 如何从时间索引中获取最后一毫秒?

python - Pandas 百分比更改为之前的 n 值

python - 随机删除重复项

python - Celery 和弦回调错误

python - Django CreateView get_initial 外键

python - 比较 Pandas Dataframe 行和删除具有重叠日期的行

python - Pandas - DataFrame 中字符串出现次数的总和

python - python pandas 分块文件中数百万键上的 grouby 问题