按行比较熊猫数据框中的每个值

时间:2020-04-19 03:28:05

标签: python python-3.x pandas

我的数据帧看起来(差不多10M)-

date          value1       value2
01/02/2019       10           120
02/02/2019       21           130
03/02/2019       0            140
04/02/2019       24           150
05/02/2019       29           160
06/02/2019       32           160 
07/02/2019       54           160
08/02/2019       32           180
01/02/2019       -3           188

我的最终输出看起来像-

date          value1       value2      result
01/02/2019       10           120        1
02/02/2019       21           130        1
03/02/2019       0            140        0
04/02/2019       24           150        1
05/02/2019       29           160        1
06/02/2019       32           160        0
07/02/2019       54           160        0
08/02/2019       32           180        1
01/02/2019      -3            188        0

我的逻辑应该是如果value1 <= 0或3个连续行(value2)相同,则结果为0,否则为1

如何在大熊猫中做

2 个答案:

答案 0 :(得分:0)

像这样的事情 np.where((df.value1.le(0)) | (df.value2.diff().eq(0)), 0, 1)

答案 1 :(得分:0)

您可以尝试定义自己的函数来处理连续值,并且value1大于0,然后groupby使用一系列自定义的连续变量,最后应用该自定义函数:

import pandas as pd
from io import StringIO

s = '''date,value1,value2
01/02/2019,10,120
02/02/2019,21,130
03/02/2019,0,140
04/02/2019,24,150
05/02/2019,29,160
06/02/2019,32,160
07/02/2019,54,160
08/02/2019,32,180
01/02/2019,-3,188'''

df = pd.read_csv(StringIO(s), header=0, index_col=0)


def fun(group_df):
    if group_df.shape[0] >= 3:
        return pd.Series([0]*group_df.shape[0], index=group_df.index)
    else:
        return group_df.value1 > 0


consecutives = (df.value2 != df.value2.shift()).cumsum()
df['results'] = df.groupby(consecutives).apply(
    fun).reset_index(level=0, drop=True)

在这种情况下,fun是一个向量化函数,用于检查对数是否为3个或更多,或者值是否大于0,则结果为:

print(df)
#            value1 value2  results
# date          
# 01/02/2019    10  120   1
# 02/02/2019    21  130   1
# 03/02/2019    0   140   0
# 04/02/2019    24  150   1
# 05/02/2019    29  160   0
# 06/02/2019    32  160   0
# 07/02/2019    54  160   0
# 08/02/2019    32  180   1
# 01/02/2019    -3  188   0