我正在处理3个数据帧,其中2个数据帧包含根据其所属范围(在单独的列中)分配给列数据的附加bin号。
df_1
A B
5 6
8 1
6 7
4 9
1 3
9 2
2 5
df_2
A B A_bin B_bin
5 6 2 2
8 1 1 1
6 7 3 2
4 9 3 3
1 3 1 1
9 2 1 1
2 5 2 2
df_3
A B C D A_bin B_bin C_bin D_bin
5 6 2 6 2 2 1 2
8 1 6 4 1 1 2 2
6 7 3 1 3 2 1 1
4 9 1 9 3 3 1 3
1 3 8 7 1 1 3 3
9 2 4 8 1 1 2 3
2 5 9 2 2 2 3 1
df_1仅包含两列,df_2具有附加列,其中包含根据所属范围分配给A和B列的bin,类似地,df_3包含具有值的列以及具有分配了bin号的附加列。
我想从df_3中提取行,以便仅提取在单独的数据帧中df_2列的每个列分别具有bin值“ 2”的数据。
我面临的主要问题是这样做没有在代码中的任何地方提到列名。
预期产量
df_output_1(其中df_2中列“ A”的bin值为2)
A B C D
5 6 2 6
2 5 9 2
df_output_2(其中df_2中“ B”列的bin值为2)
A B C D
5 6 2 6
6 7 3 1
2 5 9 2
答案 0 :(得分:2)
使用合并(右侧或左侧),我们可以过滤数据名声。
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)
答案 1 :(得分:1)
使用df.columns和列索引来防止使用列名。
您可以使用all_cols = df_2.columns
获取列名列表。
然后,使用all_cols[i]
获取列名。
例如,您可以使用df_2[all_cols[1]]
获取 B列,并使用df_2[all_cols[1 + len(all_cols) / 2]]
获取 B_bin 列。如果要获取另一列及其对应的_bin列,只需将“ 1”更改为其他数据框列索引。