pandas 根据查找将新列追加到csv

kd3sttzy  于 2023-03-06  发布在  其他
关注(0)|答案(3)|浏览(135)

我有两个csv文件lookup.csv和data.csv。我正在转换lookup.csv作为字典,需要添加新的列在data.csv的基础上列。
输入:
lookup.csv
data.csv

101 NYC 1
  202 DC  2

预期产出:
data.csv

col1 col2 col3 col4
  101  NYC  1    first
  202   DC  2    second
  ...

在这里,对于第一行,新列col4的值是第一个,因为col3的值是1,并且它在lookup.csv中的对应值是第一个。
我尝试了下面的逻辑,但在这里失败:

df = pd.read_csv("lookup.csv",header=None, index_col=0, squeeze=True).to_dict()
df1 = pd.read_csv("data.csv")
df1['col4'] = df.get(df1['col3'])

Error: TypeError: unhashable type: 'Series'

有人能帮助解决这个问题吗?

roqulrg3

roqulrg31#

首先,squeeze=True导致pd.read_csv返回一个序列,而不是 Dataframe read_csv docs(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html),这就是为什么会出现unhashable type series错误。
其次,您可以只对 Dataframe 进行merge或连接,而不是将其转换为字典,这取决于共享键是列还是索引。

df = pd.read_csv("lookup.csv", header=None, names=['num', 'name'])
df1 = pd.read_csv("data.csv", header=0, names=['foo', 'bar', 'num'])
df_merged = df.merge(df1, on='num')
vnjpjtjt

vnjpjtjt2#

get方法需要可哈希键(即单个值),但df1['col3']Series对象。请尝试apply方法:

import pandas as pd

lookup_dict = pd.read_csv("lookup.csv", header=None, index_col=0).squeeze("columns").to_dict()

data_df = pd.read_csv("data.csv", header=None, index_col=False)
data_df.columns = ['col1', 'col2', 'col3']

data_df['col4'] = data_df['col3'].apply(lambda x: lookup_dict.get(x))

print(data_df)

输出:

col1 col2  col3    col4
0   101  NYC     1   first
1   202   DC     2  second
nnsrf1az

nnsrf1az3#

你也可以用Pandasmerge的方法。
如果查找.csv为:

Code    Name
0     1   first
1     2  second

数据.csv为:

Pin Initial  Code
0  101     NYC     1
1  202      DC     2
2  101     NYC     1
3  202      DC     2
4  101     NYC     1
5  202      DC     2
6  101     NYC     1
7  202      DC     2

然后将每个csv读入 Dataframe

import pandas as pd
lookupdf = pd.read_csv('lookup.csv')
datadf = pd.read_csv('data.csv')

并将以下单个代码行与merge一起使用(将使用公共列名):

newdf = pd.merge(datadf, lookupdf)

查看结果:

print(newdf)

   Pin Initial  Code    Name
0  101     NYC     1   first
1  101     NYC     1   first
2  101     NYC     1   first
3  101     NYC     1   first
4  202      DC     2  second
5  202      DC     2  second
6  202      DC     2  second
7  202      DC     2  second

相关问题