使用dataframe.apply将每行扩展到pandas中的多行(类似于MapReduce)

时间:2014-11-12 07:29:59

标签: python pandas

这是我的问题的简化版本。 我有一个DataFrame,它具有行程的起点和终点。 我想最终得到一个适用于每个站的DataFrame 到达和离开的次数。

我熟悉类似MapReduce的工作流程 映射阶段I可以占用一行并输出多行, 然后聚合在reduce阶段的所有行。

这是我现在的代码,它不起作用。

import pandas as pd
import numpy as np

def expand_row(row):
  return pd.Series(
    { 'station': [row['start_station'], row['end_station']],
      'departures': [1, 0],
      'arrivals': [0, 1],
    },
  )

trips = pd.DataFrame({
  'start_station': ['a', 'c'],
  'end_station': ['b', 'a'],
})

expanded = df.apply(expand_row, axis=1)
aggregated = expanded.groupby('station').aggregate(np.sum)

我想要的最终DataFrame是

desired_df = pd.DataFrame({
  'station': ['a', 'b', 'c'],
  'departures': [1, 0, 1],
  'arrivals': [1, 1, 0]
})
desired_df.index = desired_df.pop('station')

非常感谢。

1 个答案:

答案 0 :(得分:0)

import pandas as pd
trips = pd.DataFrame({
  'start_station': ['a', 'c'],
  'end_station': ['b', 'a'],
})
trips.apply(pd.value_counts).fillna(0)

结果是:

   end_station  start_station
a            1              1
b            1              0
c            0              1