使用Python中的其他数据库更新2D数据库(CSV)?

时间:2013-05-24 16:00:42

标签: python pandas

我基本上有一个文件,如

Name Day1 Day2 Day3
Abe  1    2    3
Ben  2    2    1
Cat  2    3    2

我有“更新文件”格式

Name Day3 Day4
Abe  4    0
Dan  6    3

所以我需要跟踪哪些行水平延伸,哪些行垂直延伸,哪些行延伸。在excel中,这基本上就像将每个数据集拆分为4,并将数据粘贴到适当的位置。

我是一个黑客攻击解决方案,但我觉得NumPy或Pandas或其他套件可能有很好的工具用于此目的?

编辑:“更新”文件始终包含更多最新信息,因此它们包含的任何内容都会覆盖原始文件。如果有帮助,可以计算更新文件,对于任何名称/日组合,总是具有更高的数字。

2 个答案:

答案 0 :(得分:2)

如何使用pandas

>>> updated = orig.append(new).groupby('Name').last().fillna(0)
>>> updated
      Day1  Day2  Day3  Day4
Name                        
Abe      1     2     4     0
Ben      2     2     1     0
Cat      2     3     2     0
Dan      0     0     6     3

首先,读入数据(这取决于格式的细节):

>>> orig = pd.read_csv("days1.txt", delim_whitespace=True)
>>> new = pd.read_csv("days2up.txt", delim_whitespace=True)
>>> orig
  Name  Day1  Day2  Day3
0  Abe     1     2     3
1  Ben     2     2     1
2  Cat     2     3     2
>>> new
  Name  Day3  Day4
0  Abe     4     0
1  Dan     6     3

然后附加新数据,自动扩展列:

>>> orig.append(new)
   Day1  Day2  Day3  Day4 Name
0     1     2     3   NaN  Abe
1     2     2     1   NaN  Ben
2     2     3     2   NaN  Cat
0   NaN   NaN     4     0  Abe
1   NaN   NaN     6     3  Dan

按名称列合并,取最后一个有效值(最初我担心这会失去Abe的Day1和Day2信息,但事实并非如此):

>>> orig.append(new).groupby("Name").last()
      Day1  Day2  Day3  Day4
Name                        
Abe      1     2     4     0
Ben      2     2     1   NaN
Cat      2     3     2   NaN
Dan    NaN   NaN     6     3

将缺失值替换为0:

>>> orig.append(new).groupby("Name").last().fillna(0)
      Day1  Day2  Day3  Day4
Name                        
Abe      1     2     4     0
Ben      2     2     1     0
Cat      2     3     2     0
Dan      0     0     6     3

最后写出:

>>> updated = orig.append(new).groupby("Name").last().fillna(0)
>>> updated.to_csv("updated.csv")
>>> !cat updated.csv
Name,Day1,Day2,Day3,Day4
Abe,1.0,2.0,4,0.0
Ben,2.0,2.0,1,0.0
Cat,2.0,3.0,2,0.0
Dan,0.0,0.0,6,3.0

答案 1 :(得分:0)

sqlite3模块可能更适合这样的动态修改数据。它内置于Python中,很容易处理。最初,您需要使用csv模块读取数据,并且它本身可以为您尝试执行的操作提供足够的功能,尤其是在管理层坚持使用此格式的情况下。