假设我有四个连续排列的列作为数据框的一部分,我想将这4列中的所有负值替换为另一个值(-5让我们说),我该怎么办?
T1 T2 T3 T4
20 -5 4 3
85 -78 34 21
-45 22 31 75
-6 5 7 -28
从逻辑上讲,我希望这会奏效。但是,它没有。
for i in df.iloc[:,df.columns.get_loc("T1"):df.columns.get_loc("T1")+4]<0:
for j in df[i]:
if j<0:
j=-5
答案 0 :(得分:2)
您可以通过应用条件声明来使用indexing
。
cols = ['T1','T2','T3','T4']
df[df[cols] < 0] = -5
输出
In [35]: df
Out[35]:
T1 T2 T3 T4
0 20 -5 4 3
1 85 -5 34 21
2 -5 22 31 75
3 -5 5 7 -5
在您的示例中,您只是替换变量的值。您需要使用at
方法替换一个单元格的值。
for i in df.iloc[:,df.columns.get_loc("T1"):df.columns.get_loc("T1")+4]<0:
for index, j in enumerate(df[i]):
if j<0:
df.at[index, i] = -5
答案 1 :(得分:1)
对所有列使用mask
:
df = df.mask(df < 0, -5)
或者如果需要指定列:
cols = ['T1','T2','T3','T4']
df[cols] = df[cols].mask(df[cols] < 0, -5)
print (df)
T1 T2 T3 T4
0 20 -5 4 3
1 85 -5 34 21
2 -5 22 31 75
3 -5 5 7 -5
采用类似的方法,选择有问题的位置:
pos = df.columns.get_loc("T1")
df.iloc[:,pos:pos+4] = df.iloc[:,pos:pos+4].mask(df < 0, -5)
编辑:
如果exist vectorized solution,建议不要在大熊猫中使用循环解决方案,因为速度很慢。
但有可能,您的代码应该随iterrows
和iteritems
而改变:
for i, row in df.iloc[:,df.columns.get_loc("T1"):df.columns.get_loc("T1")+4].iterrows():
for j,k in row.iteritems():
if k < 0:
df.loc[i, j] = -5
print (df)
T1 T2 T3 T4
0 20 -5 4 3
1 85 -5 34 21
2 -5 22 31 75
3 -5 5 7 -5
答案 2 :(得分:1)
您可以使用索引:
c = ['T1','T2','T3','T4']
df[df[c] < 0] = -5
或clip
:
In [47]: df[c].clip(lower=-5)
Out[47]:
T1 T2 T3 T4
0 20 -5 4 3
1 85 -5 34 21
2 -5 22 31 75
3 -5 5 7 -5