替换所有大于熊猫中特定列的值的值

时间:2019-10-29 09:07:40

标签: python pandas

我尝试了多个版本,但所有版本均会发出警告,开头为:

colName = 'age'    
df_plot[colName][df_plot[colName]>10] = 10
 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. See the caveats in the documentation:
     

http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

根据警告中的链接,然后:

df_plot.loc[:, (colName, df_plot[colName]>10)] = 10
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

下一步

df_plot.loc[colName, df_plot[colName] > 10] = 10
TypeError: 'Series' objects are mutable, thus they cannot be hashed

最后还基于堆栈溢出的答案:

df_plot[colName] = df_plot[colName].apply(lambda x: [y if y <= 10 else 10 for y in x])


TypeError: 'float' object is not iterable

我在这里做什么错了?

3 个答案:

答案 0 :(得分:1)

您的第一次尝试对我来说似乎是正确的,并且在我的机器上运行时都没有警告。

df = pd.DataFrame({'age':range(5,15), 'size':range(10)})
colName = 'age'
df[colName][df[colName]>10] = 10
print(df)

输出:

   age  size
0    5     0
1    6     1
2    7     2
3    8     3
4    9     4
5   10     5
6   10     6
7   10     7
8   10     8
9   10     9

答案 1 :(得分:1)

有一种更简单的方法来获取clip值:

df_plot[colName] = df_plot[colName].clip(upper=10)

答案 2 :(得分:0)

您尝试过numpy.where()吗?让我使用@Zvika的示例df。

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({'age':range(5,15), 'size':range(10)})
>>> df
   age  size
0    5     0
1    6     1
2    7     2
3    8     3
4    9     4
5   10     5
6   11     6
7   12     7
8   13     8
9   14     9

>>> df['age'] = np.where(df['age']>10, [10],df['age'])
>>> df
   age  size
0    5     0
1    6     1
2    7     2
3    8     3
4    9     4
5   10     5
6   10     6
7   10     7
8   10     8
9   10     9