我尝试了多个版本,但所有版本均会发出警告,开头为:
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
我在这里做什么错了?
答案 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