根据条件更改具有混合类型的数据框列中的值
Change values in a dataframe column with mixed types based on a condition
我的数据集的一列同时包含字符串和浮点数。在该列中,对于每个字符串,我尝试仅将其替换为字符串的前 5 个字符。
def isfloat(num):
try:
float(num)
return True
except ValueError:
return False
df = pd.DataFrame([[1, "Alligator"], [1, 3], [4, "Markets"]], columns=['A', 'B'])
以下两种方法似乎并没有改变实际的数据帧。
df['B'].apply(lambda x: float(x) if isfloat(x) else x[0:5])
for index, row in df.iterrows():
if not isfloat(row.B):
row.B = row.B[0:5]
下一个方法导致警告“无法将系列转换为 ”,我认为是因为不能以这种方式调用 isfloat 方法。
df['B'] = np.where(not isfloat(df['B']), df['B'][0:5], df['B'])
我也尝试过使用 .loc,但它似乎不合适,因为我需要根据条件进行更改。如何解决这个问题,或者我错过了什么?
我相信你需要:
df['B']=df['B'].apply(lambda x: float(x) if isfloat(x) else x[0:5])
因为 DataFrame 没有就地编辑。
输出:
A B
0 1 Allig
1 1 3.0
2 4 Marke
您好,首先,数据框没有就地编辑。您只需要在 df.B 列中再次存储 df.B 列的编辑值。
df.B=df.B.apply(lambda x: float(x) if isfloat(x) else x[0:5])
您也可以使用下面的代码:
import pandas as pd
df = pd.DataFrame([[1, "Alligator"], [1, 3], [4, "Markets"]], columns=['A', 'B'])
newlist=[]
for v in df.B:
if type(v)==str:
newlist.append(v[:5])
else:
newlist.append(v)
df['B']=newlist
我的数据集的一列同时包含字符串和浮点数。在该列中,对于每个字符串,我尝试仅将其替换为字符串的前 5 个字符。
def isfloat(num):
try:
float(num)
return True
except ValueError:
return False
df = pd.DataFrame([[1, "Alligator"], [1, 3], [4, "Markets"]], columns=['A', 'B'])
以下两种方法似乎并没有改变实际的数据帧。
df['B'].apply(lambda x: float(x) if isfloat(x) else x[0:5])
for index, row in df.iterrows():
if not isfloat(row.B):
row.B = row.B[0:5]
下一个方法导致警告“无法将系列转换为
df['B'] = np.where(not isfloat(df['B']), df['B'][0:5], df['B'])
我也尝试过使用 .loc,但它似乎不合适,因为我需要根据条件进行更改。如何解决这个问题,或者我错过了什么?
我相信你需要:
df['B']=df['B'].apply(lambda x: float(x) if isfloat(x) else x[0:5])
因为 DataFrame 没有就地编辑。
输出:
A B
0 1 Allig
1 1 3.0
2 4 Marke
您好,首先,数据框没有就地编辑。您只需要在 df.B 列中再次存储 df.B 列的编辑值。
df.B=df.B.apply(lambda x: float(x) if isfloat(x) else x[0:5])
您也可以使用下面的代码:
import pandas as pd
df = pd.DataFrame([[1, "Alligator"], [1, 3], [4, "Markets"]], columns=['A', 'B'])
newlist=[]
for v in df.B:
if type(v)==str:
newlist.append(v[:5])
else:
newlist.append(v)
df['B']=newlist