我是Python新手,需要帮助才能解决问题:
我有两个csv文件,名为 bib.csv 和 id.csv 。这些文件里面最多包含15,000个数据。
bib.csv 看起来像:
WKT A_ID length
10 5 200
11 6 201
和 id.csv 如下所示:
Master_ID A_ID_1 A_ID_2
1 5 6
我试着找到一个解决方案,通过 <_ A> ID >来编写 bib.csv 的信息strong>进入 id.csv
最后,我将有两个csv文件,其中 长度 和 WKT 将代替 id.csv 中的 A_ID 。 例如:
Master_ID A_ID_1 A_ID_2
1 200 201
和
Master_ID A_ID_1 A_ID_2
1 10 11
我知道在Excel VBA中这样做,但我想在Python中解决这个问题。
我认为我最大的问题实际上是要知道正确的搜索关键字才能找到Informationen。
使用df.loc
我会在列中找到值,但是如何在 id.csv 中写下这些值?
循环显示所有行和列是否正确,或者是否有更好的方法来查找 A_ID , WKT < bib.csv 中的/ strong>和 长度 。
提前致谢!
答案 0 :(得分:1)
import pandas as pd
bib = pd.DataFrame({'WKT':[10,11,12], 'A_ID':[5,6,7], 'length':[200,201,202]})
# A_ID WKT length
# 0 5 10 200
# 1 6 11 201
# 2 7 12 202
ids = pd.DataFrame({'Master_ID':[1,2], 'A_ID_1':[5,5], 'A_ID_2':[6,7]})
# A_ID_1 A_ID_2 Master_ID
# 0 5 6 1
# 1 5 7 2
melted = pd.melt(ids, id_vars='Master_ID', value_name='A_ID')
merged = pd.merge(melted, bib).drop('A_ID', axis=1)
result = merged.pivot(index='Master_ID', columns='variable')
print(result['WKT'])
print(result['length'])
产量
variable A_ID_1 A_ID_2
Master_ID
1 10 11
2 10 12
variable A_ID_1 A_ID_2
Master_ID
1 200 201
2 200 202
作为michael_j_ward points out,您可以使用
result['WKT'].to_csv('WKT.csv')
result['length'].to_csv('length.csv')
将DataFrames以CSV格式写入文件。
在盯着bib
和ids
时,很自然地希望以某种方式将bib['A_ID']
与ids['A_ID_1']
和ids['A_ID_2']
联系起来。 pd.merge
是将两个DataFrame中的列与常用值合并的自然工具。
但是我们遇到了第一个障碍 - ids
DataFrame的值有两列。我们只需要一列就可以了。该问题的解决方案是使用pd.melt
将A_ID_1
和A_ID_2
合并到一个列中(下面称为A_ID
):
In [187]: melted = pd.melt(ids, id_vars='Master_ID', value_name='A_ID'); melted
Out[187]:
Master_ID variable A_ID
0 1 A_ID_1 5
1 2 A_ID_1 5
2 1 A_ID_2 6
3 2 A_ID_2 7
现在我们可以将melted
与bib
合并:
In [191]: merged = pd.merge(melted, bib).drop('A_ID', axis=1); merged
Out[191]:
Master_ID variable WKT length
0 1 A_ID_1 10 200
1 2 A_ID_1 10 200
2 1 A_ID_2 11 201
3 2 A_ID_2 12 202
现在转动产生:
In [189]: result = merged.pivot(index='Master_ID', columns='variable'); result
WKT length
variable A_ID_1 A_ID_2 A_ID_1 A_ID_2
Master_ID
1 10 11 200 201
2 10 12 200 202
答案 1 :(得分:0)
这显然可以使用一些重构,但它可以完成你想要完成的任务。关键是您需要从id.csv
文件中的行到所需输出文件中的行的良好映射。这就是getBibMap
创建的内容,然后它只是迭代和映射的问题。
import csv
def getBibMap(filename):
with open(filename, 'r') as bib:
bibreader = csv.reader(bib)
next(bibreader) # ignore header
bibmap = {A_ID: {"length": length, "WKT": WKT} for WKT, A_ID, length in bibreader}
return bibmap
bibmap = getBibMap("bib.csv")
with open("id.csv", "r") as ids:
idReader = csv.reader(ids)
headers = next(idReader)
with open("lengths.csv", 'w') as lengths:
lengthsWriter = csv.writer(lengths)
lengthsWriter.writerow(headers)
lengthsWriter.writerows((master_id, bibmap[id1]['length'], bibmap[id2]['length'])
for master_id, id1, id2 in idReader)
with open("id.csv", "r") as ids:
idReader = csv.reader(ids)
headers = next(idReader)
with open("WKT.csv", 'w') as WKTs:
wktWriter = csv.writer(WKTs)
wktWriter.writerow(headers)
wktWriter.writerows([master_id, bibmap[id1]['WKT'], bibmap[id2]['WKT']]
for master_id, id1, id2 in idReader)