我正在处理以下数据框中的数据集。
#print(old_df)
col1 col2 col3
0 1 10 1.5
1 1 11 2.5
2 1 12 5,6
3 2 10 7.8
4 2 24 2.1
5 3 10 3.2
6 4 10 22.1
7 4 11 1.3
8 4 89 0.5
9 4 91 3.3
我正在尝试生成另一个数据帧,其中包含选定的col1值作为索引,选定的col2值作为列并分配相应的col3值。
例如:
selected_col1 = [1,2]
selected_col2 = [10,11,24]
新数据框应如下所示:
#print(selected_df)
10 11 24
1 1.5 2.5 Nan
2 7.8 Nan 2.1
我尝试了以下方法
selected_col1 = [1,2]
selected_col2 = [10,11,24]
selected_df =pd.DataFrame(index=selected_col1,columns=selected_col2)
for col1_value in selected_col1:
for col2_value in selected_col2:
qry = 'col1 == {} & col2 == {}'.format(col1_value,col2_value)
col3_value = old_df.query(qry).col3.values
if(len(col3_value) > 0):
selected_df.at[col1_value,col2_value] = col3_value[0]
但是因为我的数据框有大约2000万行,所以这种蛮力的方法需要很长时间。有没有比这更好的方法了?
答案 0 :(得分:5)
首先在由&
链接的两列中按Series.isin
的成员资格对行进行按位AND
的筛选,然后使用DataFrame.pivot
:
df = df[df['col1'].isin(selected_col1) & df['col2'].isin(selected_col2)]
df = df.pivot('col1','col2','col3')
print (df)
col2 10 11 24
col1
1 1.5 2.5 NaN
2 7.8 NaN 2.1
如果可能的话,col1
和col2
中的某些重复对使用DataFrame.pivot_table
进行过滤:
df = df.pivot_table(index='col1',columns='col2',values='col3', aggfunc='mean')
编辑:
如果将|
用于按位OR
,则会得到不同的输出:
df = df[df['col1'].isin(selected_col1) | df['col2'].isin(selected_col2)]
df = df.pivot('col1','col2','col3')
print (df)
col2 10 11 12 24
col1
1 1.5 2.5 5,6 NaN
2 7.8 NaN NaN 2.1
3 3.2 NaN NaN NaN
4 22.1 1.3 NaN NaN