Python:如果列中的第n个值满足特定条件

时间:2017-01-31 17:23:38

标签: python pandas

我仍然是Python的菜鸟所以我很抱歉,如果答案显而易见......我有一些看起来与此相似的数据框(简化示例):

      0     1     2     3     
0     2     1     1     1
1     3     2     2     2
2     4     3     3     3
3     2     4     4     0

假设我需要首先检查每个其他列的第4行是否大于1,如果是,则将整列减去2.结果应如下所示:

      0     1     2     3     
0     0     1     1     1
1     1     2     2     2
2     2     3     3     3
3     0     4     4     0

在此示例中,代码应检查第0列和第2列中的第4个值(row3)是否高于1,因为从第0列满足要求后,整个列将减去2,而第2列将被忽略。

我目前有:

for flist in glob('*.csv'):
    print(flist)
    df = pd.read_csv(flist, delimiter = ',', header=None, index_col=False, skiprows=29, usecols=range(3,72))
    if df.loc[3,0::2] > 1:
        df.loc[:,0::2]-2
    if df.loc[3,0::2] < -1:
        df.loc[:,0::2]+2

这段代码可能有其他问题,但首先,当我尝试运行它时,我得到了

  

系列的真值是模棱两可的。使用a.empty,a.bool(),   a.item(),a.any()或a.all()。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

表达式df.loc[3,0::2]可以获取列表中的每个备用列,并且尝试获取一组数字的真值是没有意义的。

如果您尝试比较列表中的多个值,则必须对其进行单独检查。像

这样的东西
if df.loc[3][0] > 1 and df.loc[3][2] > 1:

另外,我不认为你可以在表达式中增加整个列,你需要通过迭代列的每个元素来做到这一点

for I in range(0,5):
    df.loc[3][i]=df.loc[3][i]+1

答案 1 :(得分:0)

您可以在一行中执行检查和减法。

df.loc[:,((df.columns % 2 == 0) & (df.loc[3,:] > 1))] -= 2

此处df.loc[:, condition]按条件对列过滤DataFrame condition实际上是两个条件:

  1. 我们只想要每隔一列((df.columns % 2 == 0)), 以及(&
  2. 仅限第四行中的条目大于1((df.loc[3,:] > 1))
  3. 的那些列

    从如此过滤的DataFrame中,您使用-= 2减去2。

    请注意,我们仅选择每个第二列的方式有效,因为我们尚未在DataFrame中指定任何标头。如果有标题,可以使用例如(numpy.arange(len(df.columns)) % 2 == 0)

    以下是完整的代码:

    import pandas as pd
    
    a =[[2 ,    1 ,    1 ,    1],
        [3 ,    2 ,    2 ,    2],
        [4 ,    3 ,    3 ,    3],
        [2 ,    4 ,    4 ,    0]]
    df = pd.DataFrame(a)
    
    df.loc[:,((df.columns % 2 == 0) & (df.loc[3,:] > 1))] -= 2
    print df
    #   0  1  2  3
    #0  0  1 -1  1
    #1  1  2  0  2
    #2  2  3  1  3
    #3  0  4  2  0