【问题标题】:Create a new column by comparing rows pandas通过比较行 pandas 创建一个新列
【发布时间】:2018-07-17 00:44:54
【问题描述】:

我的数据框是这样的

df = pd.Dataframe({ 'a': ["10001", "10001", "10002", "10002" , "10002"], 'b': ['hello', 'hello', 'hola', 'hello', 'hola']})

我想创建一个新的布尔值列“c”,条件如下:

  • 如果 'a' 的值相同(即第 1 行和第 2 行,第 3 和第 4 和第 5 行),请检查这些行的 'b' 值是否相同。 (第 2 行返回 True。第 4 行返回 False)。
  • 如果 'a' 的值不同,请跳过。

我当前的代码如下:

def check_consistency(col1,col2):
    df['match'] = df[col1].eq(df[col1].shift())
    t = []
    for i in df['match']:
        if i == True:
            t.append(df[col2].eq(df[col2].shift()))
check_consistency('a','b')

它返回错误。

【问题讨论】:

标签: python pandas dataframe string-comparison


【解决方案1】:

我想这是groupby

df.groupby('a').b.apply(lambda x : x==x.shift())
Out[431]: 
0    False
1     True
2    False
3    False
4    False
Name: b, dtype: bool

【讨论】:

    【解决方案2】:

    bitwise & 应该这样做:检查两个条件是否都满足:

    df['c'] = (df.a == df.a.shift()) & (df.b == df.b.shift()) 
    
    df.c
    #0    False
    #1     True
    #2    False
    #3    False
    #4    False
    #Name: c, dtype: bool
    

    或者,如果你想让你当前的代码工作,你可以做类似的事情(基本上做与上面相同的检查):

    def check_consistency(col1,col2):
        df['match'] = df[col1].eq(df[col1].shift())
    
        for i in range(len(df['match'])):
            if (df['match'][i] == True):
                df.loc[i,'match'] = (df.loc[i, col2] == df.loc[i-1, col2])
    
    check_consistency('a','b')
    

    【讨论】:

      猜你喜欢
      • 2019-12-20
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多