【3.7.1】Pandas--Dataframe(合并,转换,拼接)

(有需求,找)官网: https://pandas.pydata.org/pandas-docs/stable/merging.html

分期整理内容

一、 concat

普通的合并

In [1]: df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
   ...:                     'B': ['B0', 'B1', 'B2', 'B3'],
   ...:                     'C': ['C0', 'C1', 'C2', 'C3'],
   ...:                     'D': ['D0', 'D1', 'D2', 'D3']},
   ...:                     index=[0, 1, 2, 3])
   ...: 

In [2]: df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
   ...:                     'B': ['B4', 'B5', 'B6', 'B7'],
   ...:                     'C': ['C4', 'C5', 'C6', 'C7'],
   ...:                     'D': ['D4', 'D5', 'D6', 'D7']},
   ...:                      index=[4, 5, 6, 7])
   ...: 

In [3]: df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
   ...:                     'B': ['B8', 'B9', 'B10', 'B11'],
   ...:                     'C': ['C8', 'C9', 'C10', 'C11'],
   ...:                     'D': ['D8', 'D9', 'D10', 'D11']},
   ...:                     index=[8, 9, 10, 11])
   ...: 

In [4]: frames = [df1, df2, df3]

In [5]: result = pd.concat(frames)

结果:

加标签的合并

In [6]: result = pd.concat(frames, keys=['x', 'y', 'z'])

二、根据列来合并两个dataframe

2.1 求dataframe的交集

创建数据集

import pandas as pd

left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'C': ['C0', 'C2','C4']},index=['K0', 'K1', 'K2'])

right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],'D': ['D0', 'D2', 'D3']},index=['K0', 'K2', 'K3'])

print 'Left:\n'
Left:

     A   B   C
K0  A0  B0  C0
K1  A1  B1  C2
K2  A2  B2  C4


print '\nRight\n'
print right
Right

     C   D
K0  C0  D0
K2  C2  D2
K3  C3  D3

通过Index合并

result_1 = pd.merge(left, right, left_index=True, right_index=True, how='inner')

print result_1

     A   B C_x C_y   D
K0  A0  B0  C0  C0  D0
K2  A2  B2  C4  C2  D2

通过on合并

result_2 = pd.merge(left, right, on='C', how='inner')
print result_2

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C2  D2

通过left_on

result_3 = pd.merge(left, right, left_on='C', right_on='C', how='inner')
print result_3

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C2  D2

注:

这个how 有四种模式:

  • left 以左边的dataframe为主
  • right 以右边的dataframe为主
  • inner 求两个dataframe的交集
  • outer 求两个dataframe的并集

注意:这里的用来合并的key,不要有为空,也不不要有重复的,否则会报 “memory error”的问题

二、判断某个dataframe中的元素是否在另一个dataframe里面

df_4 = df_1[(~df_1.pdb.isin(df_2.pdb))]

三、用B的某一列数据去填充A的某一列

方法一:(更稳妥)

merged = df_a.merge(df_b, on='A', how='outer',
                    suffixes=('_dfa', '_dfb'))

df_a['B'] = np.where(merged['B_dfb'].isnull(),
                     merged['B_dfa'],
                     merged['B_dfb']).astype(int)

注:

np.where(condition, x, y) 满足条件(condition),输出x,不满足输出y。

方法二:update(更稳妥)

根据index去替换column

>>> df = pd.DataFrame({'A': [1, 2, 3],
...                    'B': [400, 500, 600]})
>>> new_df = pd.DataFrame({'B': [4, 5, 6],
...                        'C': [7, 8, 9]})
>>> df.update(new_df)
>>> df
   A  B
0  1  4
1  2  5
2  3  6

如果column的值过长,选择前面的

>>> df = pd.DataFrame({'A': ['a', 'b', 'c'],
...                    'B': ['x', 'y', 'z']})
>>> new_df = pd.DataFrame({'B': ['d', 'e', 'f', 'g', 'h', 'i']})
>>> df.update(new_df)
>>> df
   A  B
0  a  d
1  b  e
2  c  f

根据Index来匹配数据

>>> df = pd.DataFrame({'A': ['a', 'b', 'c'],
...                    'B': ['x', 'y', 'z']})
>>> new_column = pd.Series(['d', 'e'], name='B', index=[0, 2])
>>> df.update(new_column)
>>> df
   A  B
0  a  d
1  b  y
2  c  e
>>> df = pd.DataFrame({'A': ['a', 'b', 'c'],
...                    'B': ['x', 'y', 'z']})
>>> new_df = pd.DataFrame({'B': ['d', 'e']}, index=[1, 2])
>>> df.update(new_df)
>>> df
   A  B
0  a  x
1  b  d
2  c  e

如果数据为NA,则不进行替换

>>> df = pd.DataFrame({'A': [1, 2, 3],
...                    'B': [400, 500, 600]})
>>> new_df = pd.DataFrame({'B': [4, np.nan, 6]})
>>> df.update(new_df)
>>> df
   A      B
0  1    4.0
1  2  500.0
2  3    6.0

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn