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

时间:2018-10-30 10:27:06

标签: python python-3.x pandas dataframe data-science

我有两个数据框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

由于面临的挑战是不使用列名和索引,因为代码也应针对其他数据集运行。我尝试首先将df2的前两列迭代为{{1 }}让我知道len(df1)A_bin两列之后。 因此,当我在df2的第一列时,添加B_bin将使我进入len(df1)并对其进行迭代以检查值是否为1并将其存储在单独的数据帧中。 同样,当我在A_bin的第二列时,添加df2将把我放在len(df2)上,并将其结果存储在B_bin中。 在单独的数据框中获得预期结果。

df_result_A

df_result_B

df_result_b

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

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

示例数据帧:

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的列长选择每第3列。

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的列数。它过滤值为1的第3和第4 cols行(按照您的示例),并将其存储在字典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

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