合并具有索引的数据帧,其中一个包含另一个(但不相同)
Posted
技术标签:
【中文标题】合并具有索引的数据帧,其中一个包含另一个(但不相同)【英文标题】:Merge dataframes that have indices that one contains another (but not the same) 【发布时间】:2017-11-29 00:11:41 【问题描述】:例如df1的形状为(533, 2176)
,索引如Elkford (5901003) DM 01010
,df2的形状为(743, 12)
,索引如5901003
; df1 的索引括号中的数字将匹配 df2 的索引。正如形状所显示的,一些索引根本不匹配。现在我想要一个形状为(533, 2176+12)
的数据集,即在增加列的同时保持匹配的行。
加载数据
import pandas as pd
from tabulate import tabulate
if __name__ == '__main__':
# Read data
census_subdivision_profile = pd.read_excel('../data/census_subdivision_profile.xlsx', sheetname='Data',
index_col='Geography', encoding='utf-8').T
print(tabulate(census_subdivision_profile.head(), headers="keys", index_col='CNSSSBDVSN', tablefmt='psql'))
print(census_subdivision_profile.shape)
census_subdivision_count = pd.read_csv('../data/augmented/census_subdivision.csv', encoding='utf-8')
print(tabulate(census_subdivision_count.head(), headers='keys', tablefmt='psql'))
print(census_subdivision_count.shape)
使用第一个答案我得到了错误:
Traceback (most recent call last):
File "/Users/Chu/Documents/dssg/ongoing/economy_vs_tourism.py", line 26, in <module>
census_subdivision_profile.index = census_subdivision_profile.index.map(extract_id)
File "/anaconda/lib/python2.7/site-packages/pandas/core/indexes/base.py", line 2727, in map
mapped_values = self._arrmap(self.values, mapper)
File "pandas/_libs/algos_common_helper.pxi", line 1212, in pandas._libs.algos.arrmap_object (pandas/_libs/algos.c:31954)
File "/Users/Chu/Documents/dssg/ongoing/economy_vs_tourism.py", line 10, in extract_id
return int(m.group(0)[1:-1])
ValueError: invalid literal for int() with base 10: 'Part 1) (5917054'
只是因为
Index([u'Canada (01) 20000',
u'British Columbia / Colombie-Britannique (59) 21010',
u'East Kootenay (5901) 01010', u'Elkford (5901003) DM 01010',
u'Sparwood (5901006) DM 01010', u'Fernie (5901012) CY 01010',
u'East Kootenay A (5901017) RDA 02020',
u'East Kootenay B (5901019) RDA 01020', u'Cran*** (5901022) CY 01011',
u'Kimberley (5901028) CY 01010',
另一个是
Int64Index([5931813, 5941833, 5949832, 5919012, 5923033, 5924836, 5941016,
5955040, 5923809, 5941801,
数据框太大,放不下
【问题讨论】:
请用一个更好的例子让这个问题更清楚。阅读 [MCVE]((***.com/help/mcve) 【参考方案1】:file1.csv:
,col_1,col_2
5901001,a,-1
5901002,b,-2
5901003,c,-3
5901004,d,-4
5901005,e,-5
5901006,f,-6
5901007,g,-7
5901008,h,-8
5901009,i,-9
5901010,k,-10
这里df1.shape = (10, 2)
。
file2.csv:
,col_3
Elkford (Part 1) (5901003) DM 01010,1
Ahia (5901004) DM 01010,2
Canada (01) 20000,4
Fork (5901005) DM 01010,3
England (34) 20000,4
这里df2.shape = (3, 1)
。
运行此脚本:
import re
import pandas as pd
import numpy as np
def extract_id(s):
m = re.search('\((\d7)\)', s)
if m:
return int(m.group(1))
df1 = pd.read_csv('file1.csv', index_col=0)
df2 = pd.read_csv('file2.csv', index_col=0)
indexes = df2.index.map(extract_id)
mask = ~np.isnan(indexes)
# filter incorrect row (without id)
df2 = df2[mask]
# convert index
df2.index = indexes[mask]
df = pd.concat([df1, df2], axis=1)
print(df)
输出:
col_1 col_2 col_3
5901001 a -1 NaN
5901002 b -2 NaN
5901003 c -3 1.0
5901004 d -4 2.0
5901005 e -5 3.0
5901006 f -6 NaN
5901007 g -7 NaN
5901008 h -8 NaN
5901009 i -9 NaN
5901010 k -10 NaN
这里df.shape = (10, 2 + 1)
【讨论】:
你能解释一下吗? 我的问题更新了,请看一下。谢谢。 索引中基本上有很多括号,如何找到包含id的那个? @ZHU 我为你修复了Elkford (Part 1) (5901003)) DM 01010 -> 5901003
,但是Canada (01) 20000' -> 01
对吗?我想每一行都有一个唯一的ID。另外,Canada (20000) (01)
-> 20000 对(保持第一次出现)?
不...直接删除加拿大,因为大括号中没有 7 位数字。以上是关于合并具有索引的数据帧,其中一个包含另一个(但不相同)的主要内容,如果未能解决你的问题,请参考以下文章
将具有相同列/索引的两个 pandas DataFrame 合并为一个 DataFrame