数据帧中未更新列中元素的更改

2024-10-01 07:45:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试更新数据框列中的名称。我想:

[中]

B17.31
107.34
34
B50.56

[外]

B17.31
B107.34
B34
B50.56

我使用的代码是:

for file in df1.loc[:, '#filename']:
    new = str(file)
    if new[0] != 'B':
       final = new[:0] + 'B' + new[0:]
    else:
        final = new

    print((final))
    df1.replace(new, final)

print(df1['#filename'])
df1.to_csv('updated_name_data.csv') 

我不明白为什么它会打印出更新的名称,但不会在数据框或csv中更新。如果您能提供任何帮助或向正确的方向指示,我们将不胜感激


Tags: csv数据代码in名称newforfilename
3条回答

这应该起作用:

for file in df1.loc[:, '#filename']:
    new = str(file)
    if new[0] != 'B':
       final = new[:0] + 'B' + new[0:]
    else:
        final = new

    print((final))
    df1.replace(new, final,inplace=True)# yuo are not using inplace=True, this is required as otherwise this will return the old dataframe after replacement

    print(df1['#filename'])
    df1.to_csv('updated_name_data.csv')

您的目标应该是使用矢量化操作,而不是手动循环。例如,可以用"B"分隔数值和前缀:

s = pd.Series(['B17.31', 107.34, 34, 'B50.56'])

mask = pd.to_numeric(s, errors='coerce').notnull()
s.loc[mask] = 'B' + s.astype(str)

print(s)

0     B17.31
1    B107.34
2        B34
3     B50.56
dtype: object

在pandas中,最好避免循环,因为速度慢,最好使用矢量化函数

因此,您可以通过^{}创建布尔掩码,然后使用^{}B添加到原始列:

mask = df1['#filename'].astype(str).str.startswith('B')
df1['#filename'] = np.where(mask, df1['#filename'], 'B' + df1['#filename'].astype(str))

另一种类似的溶液,通过~反转掩模:

df1.loc[~mask, '#filename'] =  'B' + df1['#filename'].astype(str)

print (df1)
 #filename
0    B17.31
1   B107.34
2       B34
3    B50.56

相关问题 更多 >