熊猫数据处理

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
ndf1 包含 df1 和 df2 的唯一键。 ndf2 包含来自 df1 的数据 ndf3 包含来自 df2 的数据

我的问题是,Python 和 Pandas 可以实现这个工作流程吗?什么是最好的方法?

【问题讨论】:

所有这些数据帧中的ID 应该来自什么? @richardec ID 表示 A、B 和 C 的唯一值 index.intersection 和 index.difference。 @QuangHoang 你能解释一下吗! 而不是'id_0''id_1',为什么不使用df1df2中的行索引呢?那可能更干净。此外,将示例数据放入降价表是一件痛苦的事情(对您和我们而言):很难通过复制/粘贴来复制您的设置。 【参考方案1】:

我将与您的表述有所不同,以便:

    遵循 Unix/Linux 的 comm 命令的约定。 分别使用df1的索引。 df2,表示行的来源(而不是创建id_0等)。如有必要,可以将df1df2的索引设置为唯一指示出处。

有了这个,你可以做到:

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

附录

以下是如何修改df1df2 的索引以明确表示出处的示例:

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

【讨论】:

以上是关于熊猫数据处理的主要内容,如果未能解决你的问题,请参考以下文章

熊猫应用函数将多个值返回到熊猫数据框中的行

将字典的特定字典转换为熊猫数据框 - 熊猫 [重复]

熊猫数据处理

按天过滤熊猫数据框

将数组数据转换为熊猫数据框[重复]

如何替换熊猫数据框中看起来相似的值?