熊猫数据处理
Posted
技术标签:
【中文标题】熊猫数据处理【英文标题】:Pandas Data Processing 【发布时间】:2022-01-24 03:44:38 【问题描述】:我有两个数据框如下。
df1:
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | 2 | 3 | x | y | z |
df2:
A | B | C | G | H | I | |
---|---|---|---|---|---|---|
4 | 5 | 6 | p | q | r |
我想用这两个像这样制作三个数据框。
ndf1:
A | B | C | ID | |
---|---|---|---|---|
1 | 2 | 3 | id_0 | |
4 | 5 | 6 | id_1 |
ndf2:
ID | D | E | F | |
---|---|---|---|---|
id_0 | x | y | z |
ndf3:
ID | G | H | I | |
---|---|---|---|---|
id_1 | p | q | r |
我的问题是,Python 和 Pandas 可以实现这个工作流程吗?什么是最好的方法?
【问题讨论】:
所有这些数据帧中的ID
应该来自什么?
@richardec ID 表示 A、B 和 C 的唯一值
index.intersection 和 index.difference。
@QuangHoang 你能解释一下吗!
而不是'id_0'
和'id_1'
,为什么不使用df1
和df2
中的行索引呢?那可能更干净。此外,将示例数据放入降价表是一件痛苦的事情(对您和我们而言):很难通过复制/粘贴来复制您的设置。
【参考方案1】:
我将与您的表述有所不同,以便:
-
遵循 Unix/Linux 的
comm
命令的约定。
分别使用df1
的索引。 df2
,表示行的来源(而不是创建id_0
等)。如有必要,可以将df1
和df2
的索引设置为唯一指示出处。
有了这个,你可以做到:
ix1 = df1.columns.difference(df2.columns) # unique to df1
ix2 = df2.columns.difference(df1.columns) # unique to df2
ix3 = df1.columns.intersection(df2.columns) # common
u1 = df1[ix1]
u2 = df2[ix2]
common = pd.concat([df1[ix3], df2[ix3]])
关于您的示例数据:
>>> u1
D E F
0 x y z
>>> u2
G H I
0 p q r
>>> common
A B C
0 1 2 3
0 4 5 6
附录
以下是如何修改df1
和df2
的索引以明确表示出处的示例:
index1 = [f'df1_i' for i in df1.index]
index2 = [f'df2_i' for i in df2.index]
u1 = df1.set_axis(index1)[ix1]
u2 = df2.set_axis(index2)[ix2]
common = pd.concat([df1.set_axis(index1)[ix3], df2.set_axis(index2)[ix3]])
现在:
>>> u1
D E F
df1_0 x y z
>>> u2
G H I
df2_0 p q r
>>> common
A B C
df1_0 1 2 3
df2_0 4 5 6
【讨论】:
common
df 需要为每一行具有唯一的 ID,并且此 ID 引用其他 df 行,就像带有外键的 SQL 表一样。
我举了一个从初始索引生成的例子。如果这不适合您,请描述生成算法(或在哪里找到)id_0
等。
抱歉,您是说共同的列没有出现在common
中吗?列完全相同是否相同(没有偷偷摸摸的空格等)?请提供df1.head().to_dict(orient='records')
和df2.head().to_dict(orient='records')
。
不会发生,除非看起来相似的列实际上不同。正如我所说,请根据我之前的评论指出小样本的输出。
哦,所以您不是在报告问题(并非所有列都在结果中获得),而是对新功能的渴望 :将结果子集到几列。只需列出您想要的列,然后选择它(wanted = ['school', 'sex', ...]
然后使用common[wanted]
)。【参考方案2】:
您可以使用 pd.DataFrame.merge 来合并 df1 和 df2。然后只需从合并的 df 中删除不需要的列以创建 ndf1
要创建 ndf2 和 ndf3,只需使用 pd.DataFrame.drop 从 df1 和 df2 中删除不需要的 A、B 和 C 列
仅供参考
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html
【讨论】:
以上是关于熊猫数据处理的主要内容,如果未能解决你的问题,请参考以下文章