使用pandas读取和写入ID

时间:2016-06-21 18:15:14

标签: python csv pandas

我是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>和 长度

提前致谢!

2 个答案:

答案 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格式写入文件。

在盯着bibids时,很自然地希望以某种方式将bib['A_ID']ids['A_ID_1']ids['A_ID_2']联系起来。 pd.merge是将两个DataFrame中的列与常用值合并的自然工具。

但是我们遇到了第一个障碍 - ids DataFrame的值有两列。我们只需要一列就可以了。该问题的解决方案是使用pd.meltA_ID_1A_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

现在我们可以将meltedbib合并:

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)