我正在尝试清理pandas中的多个列。我有以下功能来清理它:
def convert_dash_comma_into_float(num):
if " - " in num:
num = num.replace(" - ", "0.0")
elif "," in num:
num = num.replace(',', '')
try:
return float(num)
except ValueError:
return np.nan
当我将此函数应用于单个列时,它可以正常工作。
df["rpks"].apply(convert_dash_comma_into_float)
但是当我尝试通过提供列表来应用于一系列列表时因为我要清理它们,它会引发TypeError
df[["rpks", 'asks', 'pax']].apply(convert_dash_comma_into_float)
TypeError :(“无法将系列转换为”,'发生在索引RPKs First')
以下是一些示例数据,当前对象类型为“O”:
rpks asks pax
9.74 194.72 1,752.48
19.47 82.74 700.85
- 360.16 3,679.45
127.03 994.14 7,306.93
53.54 612.75 5,770.53
- 7.02 666.43
34.52 197.28 784.19
- 460.31 5,466.80
- 108.63 1,128.90
- 16.54 913.49
10.52 368.06 3,054.90
93.93 784.55 5,646.55
答案 0 :(得分:2)
applymap
lambda
df[['rpks', 'asks', 'pax']].applymap(lambda r: '0.0' if '-' in str(r) else str(r).replace(',', ''))
rpks asks pax
0 9.74 194.72 1752.48
1 19.47 82.74 700.85
2 0.0 360.16 3679.45
3 127.03 994.14 7306.93
4 53.54 612.75 5770.53
5 0.0 7.02 666.43
6 34.52 197.28 784.19
7 0.0 460.31 5466.80
8 0.0 108.63 1128.90
9 0.0 16.54 913.49
10 10.52 368.06 3054.90
11 93.93 784.55 5646.55
答案 1 :(得分:0)
您可以在功能中使用pd.DataFrame.applymap
。
但是,我建议您重构逻辑以首先检查float
,因为如果您的数据具有代表性,则许多值已经采用可接受的格式。
这是一个例子。
def converter(num):
try:
return float(num)
except ValueError:
try:
num = num.replace('-', '0.0').replace(',', '')
return float(num)
except ValueError:
return np.nan
cols = ['rpks', 'asks', 'pax']
df[cols] = df[cols].applymap(converter)
print(df)
rpks asks pax
0 9.74 194.72 1752.48
1 19.47 82.74 700.85
2 0.00 360.16 3679.45
3 127.03 994.14 7306.93
4 53.54 612.75 5770.53
5 0.00 7.02 666.43
6 34.52 197.28 784.19
7 0.00 460.31 5466.80
8 0.00 108.63 1128.90
9 0.00 16.54 913.49
10 10.52 368.06 3054.90
11 93.93 784.55 5646.55
答案 2 :(得分:0)
你不需要在这里申请一个功能,它消耗的时间更多。只需使用内置的replace
,它很快,它也可以将字典作为参数,即
df = df.replace({'-':0.0,',':''},regex=True)
rpks asks pax
0 9.74 194.72 1752.48
1 19.47 82.74 700.85
2 0 360.16 3679.45
3 127.03 994.14 7306.93
4 53.54 612.75 5770.53
5 0 7.02 666.43
6 34.52 197.28 784.19
7 0 460.31 5466.80
8 0 108.63 1128.90
9 0 16.54 913.49
10 10.52 368.06 3054.90
11 93.93 784.55 5646.55