2017-09-15 104 views
1

我有一个数据框,其中包含分析的新闻文章瓦特/每行引用文章和列W /关于该文章(如音)的一些信息。 该df的一列包含该文章中提及的位置的FIPS国家/地区代码列表。熊猫列分隔列

我想“提取”这些国家代码,以便我得到一个数据帧,其中每个提到的位置都有自己的行,以及引用该位置的原始行的其他列(将有多行具有相同的信息,但位置不同,因为同一篇文章可能会提到多个位置)。

我尝试过这样的事情,但iterrows()速度慢,所以有没有更快/更有效的方式来做到这一点? 非常感谢。

  • “事件”是包含位置
  • 列“event_cols”从原来的DF,我想在新的DF保留列。
  • “df_events”是新数据帧
for i, row in df.iterrows(): 
    for location in df.events.loc[i]: 
    try: 
     df_storage = pd.DataFrame(row[event_cols]).T 
     df_storage['loc'] = location 
     df_events = df_events.append(df_storage) 
    except ValueError as e: 
     continue 

回答

1

我会组DataFramegroupby(),爆炸的列表与apply组合以及lambda函数,然后重置索引和下降的水平创建该列以清理生成的DataFrame

df_events = df.groupby(['event_col1', 'event_col2', 'event_col3'])['events']\ 
       .apply(lambda x: pd.DataFrame(x.values[0]))\ 
       .reset_index().drop('level_3', axis = 1) 

一般情况下,我总是试图找到一种方式来使用apply()大多数其他方法之前,因为它往往比遍历各行要快得多。

+1

我已经找到了解决我的问题,在切换到itertuples()使它神奇快:在df.itertuples() '数据= [] 用于行: 用于行位置[14]:#定义的位置在元组中的位置 data.append(row [0:13] +(location,))' –

+0

我的解决方案不起作用吗?请给它一个机会 - 它可能更高效,更紧凑。 –