从具有特定列和条件的数据框中选择行(不使用列名)

Posted

技术标签:

【中文标题】从具有特定列和条件的数据框中选择行(不使用列名)【英文标题】:selecting rows from dataframe with specific column and condition(without using column name) 【发布时间】:2018-10-30 10:27:05 【问题描述】:

我有两个数据框df1df2

df1

A B
2 6
5 1
7 3
1 2
9 7
4 7
3 4
8 9

df2 包含

A  B  A_bin  B_bin  C  D  E
2  6  1      2      5  4  1
5  1  2      1      2  2  4
7  3  3      1      5  1  7
1  2  1      1      8  4  9
9  7  3      3      5  5  8
4  7  2      3      1  8  5
3  4  1      2      2  9  3
8  9  3      3      4  6  2

我正在尝试仅选择从 df2 中选择的那些特定行到一个新的数据框 df_result_A 用于具有 A_bin = 1 的所有行 类似地,一个单独的数据框df_result_B 具有所有df2 行,使得B_bin 行包含1。 我发现很难让我的逻辑语法不正确,或者我的逻辑可能是错误的,

for i in range(len(df1(df2[columns])+len(df)):
    if(row value is 1)
print in df_result_A
print in df_result_B

挑战在于不使用列名和索引,因为代码也应该针对其他数据集运行我试图首先以len(df1) 遍历 df2 的前两列会让我知道在 2 列之后 A_binB_bin 会来。 因此,当我在 df2 的第一列时,添加 len(df1) 将使我进入 A_bin 并对其进行迭代以检查值是否为 1 并将其存储在单独的数据框中。 同样,当我在df2 的第二列时,添加len(df2) 将使我进入B_bin,从而将其结果存储在df_result_B 中。 预期结果在单独的数据帧中。

df_result_A

A  B   C  D  E
2  6   5  4  1
1  2   8  4  9
3  4   2  9  3

df_result_b

A B C D E
5 1 2 2 4
7 3 5 1 7
1 2 8 4 9

【问题讨论】:

Select rows from a DataFrame based on values in a column in pandas的可能重复 请阅读这个问题,我不能使用列名或索引(我用粗体字提到过)@Bollehenk 【参考方案1】:

你可以这样做:

示例数据框:

In [31]: df1
Out[31]: 
   A  B
0  2  6
1  5  1
2  7  3
3  1  2
4  9  7
5  4  7
6  3  4
7  8  9

In [36]: df2
Out[36]: 
   A  B  A_bin  B_bin  C  D  E
0  2  6      1      2  5  4  1
1  5  1      2      1  2  2  4
2  7  3      3      1  5  1  7
3  1  2      1      1  8  4  9
4  9  7      3      3  5  5  8
5  4  7      2      3  1  8  5
6  3  4      1      2  2  9  3
7  8  9      3      3  4  6  2

有一个变量 count 和一个空字典来动态存储新的数据帧。

count = 0
d = dict()

我已使用您的逻辑根据df1 的列长度选择每第三列。

for col in df2.columns:
    print(col)
    l = df1.shape[1]
    if count < l:
        d[col] = df2[ df2.iloc[:, count + l] == 1 ]
    count += 1

这会遍历df2 的列,直到变量count 小于df1 的列数。它过滤第 3 行和第 4 列(根据您的示例),值为 1 并存储在字典 d 中。

现在,您可以遍历字典并找到所需的新数据框:

In [52]: for key in d.keys():
    ...:     print(d[key][d[key].columns.drop(list(d[key].filter(regex='bin')))])

   A  B  C  D  E
0  2  6  5  4  1
3  1  2  8  4  9
6  3  4  2  9  3


   A  B  C  D  E
1  5  1  2  2  4
2  7  3  5  1  7
3  1  2  8  4  9

因此,您不必担心确切的列名。 让我知道这是否有帮助。

【讨论】:

谢谢,它提供了所需的输出,但是每次我们遍历 bin 列(A_bin、B_bin、C_bin 等)时,我都需要将输出存储在不同的数据帧中,假设我们有更多的 bin 列在不同的数据框中,当我们检查 bin 列 @Mayank Porwal 中的条件时,每次都应该在不同的数据框中为每个 bin 获取结果 是的,即使在我的解决方案中,结果也会存储在字典中的另一个 dataframe 中。您可以通过循环访问每个数据帧 dictionary d 如我在上一个命令中所示。只需尝试打印字典的每个键,例如for key in d.keys(): print(d[key])。这将每次输出一个单独的df。 假设如果我想检索作为 B_bin 条件结果的数据帧,我如何在不提及列名的情况下从字典中检索该特定数据帧。有没有一种方法可以在每次检查 bin 列上的条件时,输出存储在某些具有标准名称的数据帧中的输出,例如:df_output1, df_output2 其中输出编号取决于数据帧中的 bin 列。 @Mayank Porwal 字典中存储的数据帧数将等于df2中的Bin列数。它们将按照它们在df2 中出现的顺序存储在 dict 中。因此,dict 中的第一个 df 将包含 A_bin 的数据,第二个将包含 B_bin 的数据,依此类推。这里的重点是,循环在整个df2上运行,当循环结束时,它会一次返回所有bin列的数据帧。 因此可以从字典@Mayank Porwal 中检索特定的数据帧

以上是关于从具有特定列和条件的数据框中选择行(不使用列名)的主要内容,如果未能解决你的问题,请参考以下文章

在特定条件下从数据框中提取行

MySQL选择满足特定行条件的所有列名

从具有特定值的表中获取列名

如何编写 R 函数来查找数据框中的特定条件

dplyr 使用条件列和特定行进行变异

从熊猫数据框中提取在特定列中具有特定值的所有行