Python Pandas Concat "WHERE" 满足条件

Posted

技术标签:

【中文标题】Python Pandas Concat "WHERE" 满足条件【英文标题】:Python Pandas Concat "WHERE" a Condition is met 【发布时间】:2017-02-25 05:06:17 【问题描述】:

如何从许多 Python Pandas 数据帧中“连接”特定列,其中每个数据帧中的另一列满足特定条件(这里通俗地称为条件“X”)。

在 SQL 中,使用带有 WHERE df2.Col2 = "X" 和 df3.Col2 = "X" 和 df4.col2 = "X"... 等的 JOIN 子句很简单(可以动态运行)。

在我的例子中,我想创建一个大数据帧,其中包含来自许多数据帧中的每一个的所有“Col1”,但只包括 Col1 行值,其中对应的 Col2 行值大于“0.8”。不满足此条件时,Col1 值应为“NaN”。

任何想法都会很有帮助!提前致谢!

【问题讨论】:

请提供数据。连接意味着堆叠数据帧,因此类似的 SQL 语句将是 UNION。合并将对应于JOINWHERE 也表示过滤行,但您正在描述条件变化的值,因此保留行。 【参考方案1】:

考虑listdfspd.DataFrames

import pandas as pd
import numpy as np


np.random.seed([3,1415])
dfs = [pd.DataFrame(np.random.rand(10, 2),
                    columns=['Col1', 'Col2']) for _ in range(5)]

我会用pd.concat加入

原始连接 堆栈值而不考虑它来自哪里

pd.concat([d.Col1.loc[d.Col2.gt(.8)] for d in dfs], ignore_index=True)

0     0.850445
1     0.934829
2     0.879891
3     0.085823
4     0.739635
5     0.700566
6     0.542329
7     0.882029
8     0.496250
9     0.585309
10    0.883372
Name: Col1, dtype: float64

加入来源信息 使用keys 参数

pd.concat([d.Col1.loc[d.Col2.gt(.8)] for d in dfs], keys=range(len(dfs)))

0  3    0.850445
   5    0.934829
   6    0.879891
1  1    0.085823
   2    0.739635
   7    0.700566
2  4    0.542329
3  3    0.882029
   4    0.496250
   8    0.585309
4  0    0.883372
Name: Col1, dtype: float64

另一种方法 使用query

pd.concat([d.query('Col2 > .8').Col1 for d in dfs], keys=range(len(dfs)))

0  3    0.850445
   5    0.934829
   6    0.879891
1  1    0.085823
   2    0.739635
   7    0.700566
2  4    0.542329
3  3    0.882029
   4    0.496250
   8    0.585309
4  0    0.883372
Name: Col1, dtype: float64

【讨论】:

再次感谢@piRSquared!

以上是关于Python Pandas Concat "WHERE" 满足条件的主要内容,如果未能解决你的问题,请参考以下文章

python数据表的合并(python pandas join() merge()和concat()的用法)

python数据表的合并(python pandas join() merge()和concat()的用法)

python--pandas合并与连接

Python,在 Pandas DataFrame 的“group concat”中使用“order by”

Python数据分析库pandas ------ mergeconcatenation pd.concat合并与拼接

Python Pandas Concat "WHERE" 满足条件