从具有特定列和条件的数据框中选择行(不使用列名)
Posted
技术标签:
【中文标题】从具有特定列和条件的数据框中选择行(不使用列名)【英文标题】:selecting rows from dataframe with specific column and condition(without using column name) 【发布时间】:2018-10-30 10:27:05 【问题描述】:我有两个数据框df1
和df2
,
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_bin
和 B_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 中检索特定的数据帧以上是关于从具有特定列和条件的数据框中选择行(不使用列名)的主要内容,如果未能解决你的问题,请参考以下文章