我有一个从未格式化的csv生成的数据框。所以我需要格式化一些数据(例如,有一些字符串为12.323,03为浮点格式,我试图将它们转换为12323.03用于将字符串转换为python中的float)我试着这样做:
for column in data:
if(data[column].name != 'blabla' and data[column].name != 'otherblabla'):
for row_value in data[column]:
if type(row_value) == str:
float_format = row_value.replace('.','').replace(',','.')
row_value = row_value.replace(row_value, float_format)
浮动格式:转换字符串"12.323,03"12323.03"。但是行值不受影响。我错过了什么?
要影响新值,必须使用
定位它df。Loc [row_index,column_name] = row_value
请尝试枚举。
for row_index, row_value in enumerate(data_column):
这里有一个例子来理解它:
df = pd.DataFrame({'A':[1,2,3,4],'B':[5,6,7,8]})
print('Before change')
print(df)
for i,j in enumerate(df['B']):
if j == 6:
df.loc[i,'B'] = 4
print('Afetr Change')
print(df)
变量row_value
是原始df中不引用df位置的行/列对的单个值。正如另一个答案在您的方法中指出的那样,您需要找到值以便更改df。
另外,我想提到的是,row_value
的第二个replace
可以简单地用row_value = float_format
代替。此外,我与您分享一种使用apply
的方法,我认为它更干净,您可能会觉得有用:
df = pd.DataFrame(
{
'c1': ['100,12', 1.230, '30.000,4'],
'c2': ['5.367,46', '10', 7.3],
'c3': ['a', 'b', 'c']
}
)
cols = ['c1', 'c2']
for col in cols:
df[col] = df[col].apply(
lambda x: float(x.replace('.','').replace(',','.')) if type(x) == str else x
)
结果是:
c1 c2 c3
0 100.12 5367.46 a
1 1.23 10.00 b
2 30000.40 7.30 c
c1 float64
c2 float64
c3 object
dtype: object