csv 根据一列的值替换另一列的值

ymzxtsji  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(177)

我有两个.csv文件。
"数据. csv":
| 识别号|开始_秒|结束_秒|标号|
| - ------| - ------| - ------| - ------|
| - -PJHxphWE|三万|四万|"/月/09日第0天,/吨/日00088 "|
| - -浙V派1s|五万|六万|"/m/012xff "|
'labels.csv'(此文件中有大约500个标签,但仅向您展示其外观):
| 索引|标号|标签_en|
| - ------| - ------| - ------|
| 无|/月/09x0r| "演讲"|
| 1个|/月/05日|"男人说话,男人说话"|
我想取"data.csv"中的标签,将它们与"labels.csv"中的标签进行比较,然后将相应的labels_en保存到"data.csv"中的新列。
正如您所看到的,可能有多个标签需要与'data.csv'标签进行比较,但是它们都在一个字符串中,如表的第一行所示"/m/09x0r,/t/dd00088 "--这是两个不同的值,需要为其查找相应的labels_en。
标签不包含在""中也有一些困难,因此"data. csv"标签中的数据类型与"labels. csv"标签中的数据类型不同。
我该怎么做呢?我已经在python中尝试了一些不同的东西,但是没有任何乐趣。有人能给我一些建议吗?或者至少给我指出正确的方向。
目前为止我试过的代码是:

import pandas as pd

df2 = pd.read_csv('labels.csv')
df1 = pd.read_csv('data.csv')

merged_df = pd.merge(df2, df1, on='labels')

for index, row in merged_df.iterrows():
  labels = row['labels']
  string = row['labels_en']
  df2.loc[df2['labels'] == labels, 'labels'] = string

df2.to_csv('modified_csv.csv', index=False)

但我不认为它甚至还没有接近,pd.merge()不工作,因为标签的类型是不同的。

nnsrf1az

nnsrf1az1#

对于您的问题,将df1labels替换为df2labels的最佳方法可能是,将df2labelslabels_en列替换为dictionary,并在替换中使用它们。
下面是执行此操作的代码:

import pandas as pd

df2 = pd.read_csv('labels.csv')
df1 = pd.read_csv('data.csv')

df=df2.drop(["index"],axis=1) # Removing unnecessary Column
di=dict(df.values) # {"/m/09x0r":"Speech",....}

def replace(x):
    r=[]
    for a in x.split(","):
        b=di.get(a)
        if b==None:
            r.append(a)
        else:
            r.append(b)
    return ",".join(r)

# Just replacing in same column
df1["labels"]=df1["labels"].apply(replace) # You may make new column
print(df1)

"""
Output: 
            ID  start_sec  end_sec             labels
0  --PJHxphWEs       30.0     40.0  Speech,/t/dd00088
1  --ZhevVpy1s       50.0     60.0          /m/012xff
"""

我们在这里做的是,首先导入数据.csv和标签.csv文件。使用labels.csv文件制作字典。并使用字典替换df1中以“”分隔的labels

相关问题