2017-09-15 132 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

我的解決方案不起作用嗎?請給它一個機會 - 它可能更高效,更緊湊。 –