我仍然是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()。
任何帮助都将不胜感激。
答案 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
实际上是两个条件:
(df.columns % 2 == 0)
),
以及(&
)(df.loc[3,:] > 1))
)从如此过滤的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