如何在其他数据框中使用列值生成数据框

时间:2019-05-30 10:58:50

标签: python pandas dataframe

我正在处理以下数据框中的数据集。

#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万行,所以这种蛮力的方法需要很长时间。有没有比这更好的方法了?

1 个答案:

答案 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

如果可能的话,col1col2中的某些重复对使用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