【问题标题】:Add columns on a pandas DataFrame with data inside a dictionary使用字典中的数据在 pandas DataFrame 上添加列
【发布时间】:2017-10-29 23:43:39
【问题描述】:

我有一个这样的熊猫数据框p_df

        date_loc        timestamp  
id                                                                    
1       2017-05-29  1496083649   
2       2017-05-29  1496089320   
3       2017-05-29  1496095148   
4       2017-05-30  1496100936   
...

还有一个像这样的字典

observations = {
   '1496089320': {
       'col_a: 'value_a',
       'col_b: 'value_b',
       'col_c: 'n/a'
   },
   '1496100936' : {
       'col_b: 'value_b'
   },
   ...
}

当字典中的键也存在于timestamp 列中时,我想将observations 子字典中包含的所有值及其各自的键作为列名添加,以便生成的数据框为

        date_loc     timestamp     col_a    col_b   col_c
id                                                                    
1       2017-05-29  1496083649   
2       2017-05-29  1496089320   value_a  value_b     n/a
3       2017-05-29  1496095148   
4       2017-05-30  1496100936            value_b
...

我尝试了几种方法(agg()apply()iterrows()),但还没有任何效果。例如,这是我的最后一次尝试

p_df['col_a'] = ''
p_df['col_b'] = ''
p_df['col_c'] = ''

for index, row in p_df.iterrows():
    ts  = p_df.loc[index, 'timestamp']
    if ts in observations:
        # how to concat column values in this row?
    # end if
#end for

可能我觉得还有比迭代数据框行更好的方法,所以我愿意接受比这更好的选择。

【问题讨论】:

    标签: python pandas dictionary dataframe append


    【解决方案1】:

    您可以从字典中构造一个数据框,然后与timestamp 列上的原始数据框合并:

    import pandas as pd
    # make sure the timestamp columns are of the same type
    df.timestamp = df.timestamp.astype(str)
    ​
    df.merge(pd.DataFrame.from_dict(observations, 'index'), 
             left_on='timestamp', right_index=True, how='left').fillna('')
    
    #     date_loc   timestamp   col_b  col_c   col_a
    #id                 
    #1  2017-05-29  1496083649          
    #2  2017-05-29  1496089320  value_b n/a value_a
    #3  2017-05-29  1496095148          
    #4  2017-05-30  1496100936  value_b     
    

    【讨论】:

    • 它几乎可以工作,谢谢,但是 1)fillna() 我有这个错误:raise AssertionError("Gaps in blk ref_locs"),没有它工作:2)在我的字典中我有很多键不包含在数据框中所以合并给了我很多空行
    • 抱歉,没有仔细阅读您的问题。看起来您需要左连接而不是完全连接;不过不确定fillna() 问题。我以前没有遇到过这样的fillna 错误。
    猜你喜欢
    • 2017-10-28
    • 2017-04-22
    • 2018-10-22
    • 2019-08-12
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多