【问题标题】:join missing rows from another table columns in Python在 Python 中连接来自另一个表列的缺失行
【发布时间】:2018-02-05 22:37:45
【问题描述】:

我在 Python 中有两个表(作为 DataFrames)。一种如下:

Country     Year    totmigrants
Afghanistan 2000    
Afghanistan 2001    
Afghanistan 2002    
Afghanistan 2003    
Afghanistan 2004    
Afghanistan 2005    
Afghanistan 2006    
Afghanistan 2007    
Afghanistan 2008    
Algeria     2000    
Algeria     2001    
Algeria     2002
...
Zimbabwe    2008

另一个是针对每一年(2000-2008 年共有 9 个单独的 DataFrame):

Year=2000
---------------------------------------
Country    totmigrants  Gender  Total
Afghanistan 73           M     70
Afghanistan              F     3
Albania     11           M     5
Albania                  F     6
Algeria     52           M     44
...
Zimbabwe                 F     1

我想将它们连接在一起,第一个表是外部连接。 我有这个想法,但这仅适用于按列合并:

new=pd.merge(table1,table2,how='left',on=['Country', 'Year'])

我想看到的是,从每个数据框中每年的移民总数中,F 和 M 出现在第一个表的新列中:

Country     Year    totmigrants F  M
Afghanistan 2000      73       3  70
Afghanistan 2001    table3
Afghanistan 2002    table4
Afghanistan 2003    ...
Afghanistan 2004    
Afghanistan 2005    
Afghanistan 2006    
Afghanistan 2007    
Afghanistan 2008    
Algeria     2000    52          8 44
Algeria     2001    table3      ...
Algeria     2002    table4      ...
...
Zimbabwe    2008     ...        ...

这个合并有没有具体的方法,或者需要用到什么函数?

【问题讨论】:

  • 在合并之前,尝试 groupby country 和 sum totalmigrants,或者只选择具有 totalmigrant 整数值的行。
  • 第一个表没有任何有用的数据(除非您没有向我们显示所有列)。为什么你需要它?
  • @DYZ 该表中还有 10 个变量。我不能全部复制粘贴。其他变量已准备就绪,但仅缺少 totmigrants, F and M。我需要它来运行回归。

标签: python pandas dataframe join merge


【解决方案1】:

以下是合并年度数据框中数据的方法。让我们假设每年的数据帧以某种方式存储在字典中:

df = {2000: ..., 2001: ..., ..., 2008: ...}
yearly = []

for N in df.keys():
    tmp = df[N].pivot('Country','Gender','Total').fillna(0).astype(int)
    tmp['Year'] = N # Store the year
    tmp['totmigrants'] = tmp['M'] + tmp['F']
    yearly.append(tmp)

df = pd.concat(yearly)
print(df)
#Gender       F   M  Year  totmigrants
#Country                              
#Afghanistan  3  70  2000           73
#Albania      6   5  2000           11
#Algeria      0  44  2000           44
#Zimbabwe     1   0  2000            1

现在您可以使用['Country','Year'] 作为键将df 与第一个数据帧合并。

【讨论】:

  • 这很有帮助。将数据转换为数据框时,我遇到了这个问题:在某些表中,性别行被合并。例如Afghanistan 108.0 M\nF 98\n10 Albania 18.0 M\nF 10\n8
  • 如何在将它们转换为 Dataframe 之前将它们分成两个不同的行?
  • 这是一个不同的问题,需要它自己的代码和示例数据。
【解决方案2】:

我不确定您是否需要第一张桌子。我做了以下,希望对您有所帮助。

data2000 = np.array([['','Country','totmigrants','Gender', 'Total'],
['1','Afghanistan', 73, 'M', 70],
['2','Afghanistan', None, 'F', 3],
['3','Albania', 11, 'M', 5],
['4','Albania', None ,'F', 6]])

data2001 = np.array([['','Country','totmigrants','Gender', 'Total'],
['1','Afghanistan', 75, 'M', 60],
['2','Afghanistan', None, 'F', 15],
['3','Albania', 15, 'M', 11],
['4','Albania', None ,'F', 4]])

# and so on
datas = {'2000':data2000, '2001':data2001}
reg_dfs = []
for year,data in datas.items():
    df = pd.DataFrame(data=data[1:,1:],
              index=data[1:,0],
              columns=data[0,1:])

    new=pd.merge(df,df,how='inner',on=['Country'])
    reg_df = new.query('Gender_x == "M" & Gender_y == "F"' )[['Country', 'Total_x', 'Total_y', 'totmigrants_x']]
    reg_df.columns = ['Country', 'M', 'F', 'Total']
    reg_df['Year'] = year
    reg_dfs.append(reg_df)

print(pd.concat(reg_dfs).sort(['Country']))

#       Country   M   F Total  Year
#1  Afghanistan  70   3    73  2000
#1  Afghanistan  60  15    75  2001
#5      Albania   5   6    11  2000
#5      Albania  11   4    15  2001

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多