Python 相对于其他数据框中的bin值从数据框中提取行(不使用列名)

Python 相对于其他数据框中的bin值从数据框中提取行(不使用列名),python,python-3.x,pandas,dataframe,data-science,Python,Python 3.x,Pandas,Dataframe,Data Science,我使用的是3个数据帧,其中2个数据帧包含根据其所属范围(在单独的列中)分配给列数据的额外bin编号 df_1 A   B 五,   六, 八,   一, 六,   七, 四,   九, 一,   三, 九,   二, 二,   五, df_2 A   B   阿宾   布宾 五,   6.   2.     二, 八,   1.   1.     一, 六,   7.   3.     二, 四,   9  

我使用的是3个数据帧,其中2个数据帧包含根据其所属范围(在单独的列中)分配给列数据的额外bin编号

df_1

A   B

五,   六,

八,   一,

六,   七,

四,   九,

一,   三,

九,   二,

二,   五,

df_2

A   B   阿宾   布宾

五,   6.   2.     二,

八,   1.   1.     一,

六,   7.   3.     二,

四,   9   3.     三,

一,   3.   1.     一,

九,   2.   1.     一,

二,   5.   2.     二,

df_3

A   B   C   D   阿宾   布宾   库宾   杜斌

五,   6.   2.   6.    2.     2.     1.     二,

八,   1.   6.   4.    1.     1.     2.     2.    

六,   7.   3.   1.    3.     2.     1.     1.    

四,   9   1.   9    3.     3.     1.     3.    

一,   3.   8.   7.    1.     1.     3.     3.    

九,   2.   4.   8.    1.     1.     2.     3.    

二,   5.   9   2.    2.     2.     3.     一,

df_1仅包含两列,df_2具有附加列,其中包含根据所属范围分配给A列和B列的bin,类似地,df_3包含带值的列和分配bin编号的附加列

我想从df_3中提取行,这样它只提取df_2列在单独的数据帧中每列的bin值分别为“2”的数据

我面临的主要问题是在代码中任何地方都不提及列名

预期产量

df_输出_1(其中df_2中列“A”的bin值为2)

A   B   C   D  

五,   6.   2.   六,

二,   5.   9   二,

df_输出_2(其中df_2中“B”列的bin值为2)

A   B   C   D  

五,   6.   2.   六,

六,   7.   3.   一,

二,   5.   9   2

使用和列索引来防止使用列名

您可以使用
all_cols=df_2.columns
获取列名列表。 然后,使用
all\u cols[i]
获取列名

例如,您可以使用
df_2[all_cols[1]]
获取列B,使用
df_2[all_cols[1+len(all_cols)/2]
获取列B_bin。如果您想获得另一列及其对应的_bin列,只需将“1”更改为其他dataframe列索引

使用合并(右或左)我们可以过滤数据

    for bin_name in (column_name + "_bin" for column_name in df_1_columns):
      print(bin_name)
      df_3_joined = pd.merge(df_3[df_3_op_columns], df_2[df_2[bin_name] == 2][df_1_columns], how='right', on=df_1_columns, suffixes=['_l', ''])
      print(df_3_joined)
完整的例子是

import pandas as pd

df_1 = pd.DataFrame(columns = ['A', 'B'])
df_1.loc[len(df_1)] = [5,6]
df_1.loc[len(df_1)] = [8, 1]
df_1.loc[len(df_1)] = [6, 7]
df_1.loc[len(df_1)] = [4, 9]
df_1.loc[len(df_1)] = [1, 3]
df_1.loc[len(df_1)] = [9, 2]
df_1.loc[len(df_1)] = [2, 5]

df_2 = pd.DataFrame(columns = ['A', 'B', 'A_bin', 'B_bin'])
df_2.loc[len(df_2)] = [5, 6, 2, 2]
df_2.loc[len(df_2)] = [8, 1, 1, 1]
df_2.loc[len(df_2)] = [6, 7, 3, 2]
df_2.loc[len(df_2)] = [4, 9, 3, 3]
df_2.loc[len(df_2)] = [1, 3, 1, 1]
df_2.loc[len(df_2)] = [9, 2, 1, 1]
df_2.loc[len(df_2)] = [2, 5, 2, 2]

df_3 = pd.DataFrame(columns = ['A', 'B', 'C', 'D', 'A_bin', 'B_bin', 'C_bin', 'D_bin'])
df_3.loc[len(df_3)] = [5, 6, 2, 6, 2, 2, 1, 2]
df_3.loc[len(df_3)] = [8, 1, 6, 4, 1, 1, 2, 2]
df_3.loc[len(df_3)] = [6, 7, 3, 1, 3, 2, 1, 1]
df_3.loc[len(df_3)] = [4, 9, 1, 9, 3, 3, 1, 3]
df_3.loc[len(df_3)] = [1, 3, 8, 7, 1, 1, 3, 3]
df_3.loc[len(df_3)] = [9, 2, 4, 8, 1, 1, 2, 3]
df_3.loc[len(df_3)] = [2, 5, 9, 2, 2, 2, 3, 1]

results = {}
df_1_columns = list(df_1.columns)
df_3_op_columns = [cname for cname in list(df_3.columns) if not cname.endswith("_bin")]
for bin_name in (column_name + "_bin" for column_name in df_1_columns):
    df_3_joined = pd.merge(df_3[df_3_op_columns], df_2[df_2[bin_name] == 2][df_1_columns], how='right', on=df_1_columns)
    results[bin_name] = df_3_joined

for binName, result in results.iteritems():
    print(binName)
    print(result)
如果您知道bin名称,则按如下方式检索结果

A_bin_df = results['A_bin']
print(A_bin_df)
B_bin_df = results['B_bin']
print(B_bin_df)

您是否使用一些代码来创建
df_2
df_3
?你能分享它吗?导入numpy作为np def binner(df_1,num_bins):对于df_1.columns中的c:cbins=np.linspace(min(df_1[c])、max(df_1[c])、num bins)dfu 1[c+''u binn']=np。数字化(df_1[c],cbins)返回df_1 df_2=binner(df_1,3)@jezrael这就是我如何将dfu 1转换为dfu 2tanks的,它帮助很大。但是,当应用到更大的数据集时,它会引起混乱。这是在相互下方打印A_-bin和B_-bin。当打印功能外连接的df_3_时,仅根据第二列(B_箱)打印。是否有方法将bin=2的每个数据列的行分别存储在单独的数据帧中@是的,我们可以。一种选择是使用字典并将结果存储到其中
results={}
和for-loop
results[bin_name]=df_3_join
@Xpeditions dictionary是正确的方法,即使它可以框架转换为数据帧,但我们能否以字典或数据帧的形式单独检索binName及其结果,以便每个数据帧都可以单独使用,在检索结果时,它会显示最新的存储值,即b_bin和使用append对我来说不太合适。@xpeditions您能分享一下您尝试过的代码吗?还有所需的输出?都是单独的数据帧,如果你知道bin名称,那么你可以得到它
A_-bin_-df=results['A_-bin']print(A_-bin_-df)B_-bin_-df=results['B_-bin']print(B_-bin_-df)
我也更新了这个示例。我正在尝试制作一个模板代码,使它可以在一个数据帧上运行,即使它有100列,要为任意随机数据帧生成模板代码,数据帧可能有任意数量的列,而我们可能不知道列索引。因此,我想应该采用迭代方法@高佳翔