有没有办法在pandas中对单个列进行舍入而不影响数据帧的其余部分?
df:
item value1 value2
0 a 1.12 1.3
1 a 1.50 2.5
2 a 0.10 0.0
3 b 3.30 -1.0
4 b 4.80 -1.0
df.value1.apply(np.round) 给出
0 1
1 2
2 0
3 3
4 5
5 5
使数据看起来像这样的正确方法是什么:
item value1 value2
0 a 1 1.3
1 a 2 2.5
2 a 0 0.0
3 b 3 -1.0
4 b 5 -1.0
5 c 5 5.0
答案 0 :(得分:48)
你非常接近。
您将该轮应用于df.value1
给出的一系列值。
返回类型因此是系列。
您需要将该系列分配回数据框(或具有相同索引的其他数据框)。
此外,还有pandas.Series.round
方法基本上是pandas.Series.apply(np.round)
的简写。
In[2]:
df.value1 = df.value1.round()
print df
Out[2]:
item value1 value2
0 a 1 1.3
1 a 2 2.5
2 a 0 0.0
3 b 3 -1.0
4 b 5 -1.0
答案 1 :(得分:21)
由于某种原因,如果你有一个带有许多小数位的浮点数,round()方法就不起作用了,但是这样做。
decimals = 2
df['column'] = df['column'].apply(lambda x: round(x, decimals))
答案 2 :(得分:9)
答案 3 :(得分:5)
无需使用for循环。它可以直接应用于数据框的列
sleepstudy['Reaction'] = sleepstudy['Reaction'].round(1)
答案 4 :(得分:2)
无需使用 lambda 或创建函数。这是直接的。 看下面的例子
df['decimal_place_2'] = df['decimal_place_2'].round(2)
答案 5 :(得分:1)
如果您正在进行机器学习并使用tensorflow,则许多float都是'float32'而非'float64'的,并且该线程中提到的任何方法都可能不起作用。您首先必须先转换为float64。
x.astype('float')
在回合之前(...)。
答案 6 :(得分:0)
就我而言,我在单列中既有字符串值又有十进制值。
def round_2(x):
try:
return round(x,2)
except:
return x
df['cur_TMIN_IMD_WeekSum']=df['cur_TMIN_IMD_WeekSum'].apply(round_2)
答案 7 :(得分:-1)
简单的列表理解就可以解决问题
decimals = 2
df['column'] = [round(x, decimals) for x in df['column']]