Python Pandas 加入索引值

Posted

技术标签:

【中文标题】Python Pandas 加入索引值【英文标题】:Python Pandas Join with Index value 【发布时间】:2019-05-04 20:46:03 【问题描述】:

我想加入 2 个 DataFrame,例如: 数据帧1:

A 1
B 2
C 3
D 4

数据帧2:

A 1
A 3
B 4
B 3
B 7
C 4
D 6
D 8

结果应该是这样的:

A 1 1    
    3    
B 2 4    
    3    
    7    
C 3 4
D 4 6    
    8

我尝试加入合并和连接,但没有任何效果,请您帮帮我。

【问题讨论】:

【参考方案1】:

一种方法是这样的:

df_out = pd.concat([df1,df2])

df_out.set_index([0,df_out.groupby([0]).cumcount()])[1].unstack()

输出:

     0    1    2    3
0                    
A  1.0  1.0  3.0  NaN
B  2.0  4.0  3.0  7.0
C  3.0  4.0  NaN  NaN
D  4.0  6.0  8.0  NaN

编辑更新以匹配预期输出:

df_out = pd.concat([df1,df2])

df_out = df_out.set_index([0,df_out.groupby([0]).cumcount()])[1]

df_out.sort_index()

输出:

A  0    1
   1    1
   2    3
B  0    2
   1    4
   2    3
   3    7
C  0    3
   1    4
D  0    4
   1    6
   2    8
Name: 1, dtype: int64

编辑更新一点...

df_out = pd.concat([df1,df2])

df_out = df_out.set_index([0,df_out.groupby([0]).cumcount()])[1]

df_out = df_out.sort_index().to_frame()

df_out = df_out.reset_index().drop('level_1', axis=1)

df_out[0] = df_out[0].mask(df_out[0].duplicated()).fillna('')

print(df_out)

输出:

    0  1
0   A  1
1      1
2      3
3   B  2
4      4
5      3
6      7
7   C  3
8      4
9   D  4
10     6
11     8

【讨论】:

@Beginner2018 是吗? 您最好编辑您的问题。用四个空格引导您的预期输出的每一行。 在 pandas 中,每一行都必须有一个索引标签,因此我的输出中有 0,1,2 01,2,3... 等行。 Bosten 真的很感谢 :D 它现在可以与隔断线一起使用。也非常感谢代码【参考方案2】:

你可以这样做:

import pandas as pd

data1 = [['A', 1],
         ['B', 2],
         ['C', 3],
         ['D', 4]]

data2 = [['A', 1],
         ['A', 3],
         ['B', 4],
         ['B', 3],
         ['B', 7],
         ['C', 4],
         ['D', 6],
         ['D', 8]]

df1 = pd.DataFrame(data=data1, columns=['c1', 'c2'])
df2 = pd.DataFrame(data=data2, columns=['c1', 'c2'])
result = pd.concat([df1, df2]).groupby('c1')['c2'].apply(list)

print(result)

输出

c1
A       [1, 1, 3]
B    [2, 4, 3, 7]
C          [3, 4]
D       [4, 6, 8]
Name: c2, dtype: object

或者没有列:

df1 = pd.DataFrame(data=data1)
df2 = pd.DataFrame(data=data2)
result = pd.concat([df1, df2]).groupby(0)[1].apply(list)

print(result)

输出

0
A       [1, 1, 3]
B    [2, 4, 3, 7]
C          [3, 4]
D       [4, 6, 8]
Name: 1, dtype: object

【讨论】:

@RavinderSingh .apply(list) 将函数列表应用于groupby的组。 @Beginner 你能说得更具体点吗?

以上是关于Python Pandas 加入索引值的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas - 如何在具有不同级别数的索引上加入 DataFrames?

Python的pandas 数组如何得到索引值,如图,我要得到ohio 的索引值,应该怎样做?

Python、Pandas:80/20 随机拆分数据;当索引值“丢失”时如何循环?

Python Pandas基于最小索引从数据帧中提取值

python pandas库学习

Pandas - 在 DataFrame 中的任何位置查找值索引