Python 相对于其他数据框中的bin值从数据框中提取行(不使用列名)
我使用的是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使用和列索引来防止使用列名 您可以使用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
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-loopresults[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列,要为任意随机数据帧生成模板代码,数据帧可能有任意数量的列,而我们可能不知道列索引。因此,我想应该采用迭代方法@高佳翔