pandas df to dict to series to df不会产生原始的df

时间:2016-04-07 19:26:13

标签: python dictionary pandas dataframe

我正在进行df.apply(myfunction, args=(df2,x,y,z), axis=1)

myfunction()的结果是一个数据帧。但为了使这与df.apply()一起使用,返回对象必须是pd.Series。

myfunction()返回的数据帧为每列提供了各种列和6行数据。

我将df转换为dict然后转换为系列,以便它可以与df.apply()一起使用。

pd.Series(df.to_dict()):

的输出
    book_sale_date                      {0: 2016-03-01 00:00:00, 1: 2016-03-01 00:00:0...
    countx                                    {0: 17, 1: 31, 2: 92, 3: 12, 4: 92, 5: 92}
    dbNUM                             {0: 93353485.0, 1: 93353485.0, 2: 93353485.0, ...
    ...

当我将此结构转换回数据帧时,如下所示:

pd.DataFrame(df.apply(myfunction, args=(df,x,y,z), axis=1))

结果具有正确的列,但只有1行在相应列中具有正确的数据类型,但都集中在一行中。

例如book_sale_date列如下:

{0: 2016-03-01 00:00:00, 1: 2016-03-01 00:00:0, 2: 2016-03-01 00:00:0, 3: 2016-03-01 00:00:0, 4: 2016-03-01 00:00:0, 5: 2016-03-01 00:00:0}

以下是intermediate_df.to_clipboard()的输出,这是我要构建的df,但我被迫将其转换为dict,然后转换为与.apply()一起使用的系列。

    sale_month  countx  onnfl_cumsum_minmax_c_sum_ratio onnfl_max   onnfl_min   onnfl_sprd  onnfl_sprd_median   onnfl_sprd_neg_count    onnfl_sprd_neg_sum  onnfl_sprd_pos_count    onnfl_sprd_pos_neg_sum_ratio    onnfl_sprd_pos_sum
0   2016-03-01  17  1.54829687344   117.69  -37.31  100.11      0.588235294118  -54.89  0.176470588235  2.82382947714   155.0
1   2016-03-01  31  1.28473432668   220.14  -8.35   177.85      0.354838709677  -72.39  0.290322580645  3.45683105401   250.24
2   2016-03-01  92  1.21749735751           -860.93     0.478260869565  -1185.49    0.195652173913  0.273777087955  324.56
3   2016-03-01  12      13708.76    -937.27 17069.77    292.365 0.25    -1970.44    0.75    9.66292300197   19040.21
4   2016-03-01  92  1.00115588305   13708.76    389.47  15511.95    1413.72 0.282608695652  -376.35 0.413043478261  42.21681945 15888.3
5   2016-03-01  92  1.03090199741   98.32   -4765.51    -5139.15    -471.96 0.489130434783  -5945.64    0.20652173913   0.135643934042  806.49

更新

我遇到了link

的某些变体

我的另一个问题是,如果所需的结果是数据帧,那么使用df.apply()即使是正确的方法也是如此?

以下是我要做的事情:

1)我有一个2列的数据帧df,有100万行。

2)2列是城市的名称 - city1和city2。每一行都是来自大量城市的城市组合。

3)我有另一个名为df的数据框,它包含4000个城市的每日每小时温度数据。

4)我想迭代df的每一行并在df2中进行查找以提取2个城市中每个城市的温度数据并计算各种统计数据,即特定时间内的温度传播,总和,平均值等

5)结果对象是一个数据框,每个城市对有6行和约45列统计数据

如果我通过传递与传递给df.apply()的参数相同的参数来自行运行myfunction()单行df,那么这就行了。我的问题是我应该在每行df或df.apply()的for循环中运行myfunction()吗?对于100万行df来说速度更快。

1 个答案:

答案 0 :(得分:0)

我得到我想要的工作方式是做以下事情:

1)更改myfunction()函数以返回pd.Series(intermediate_df.unstack())

因此,在将所需数据帧转换为Series对象之前,将其取消堆叠

2)将我的号码df.apply()更改为:

df.apply(myfunction, args=(df2,x,y,z), axis=1).stack().reset_index(drop=True)

我遵循以下link给出的关于如何从DataFrame创建系列目标的指示。

也许Pandas文档想要添加示例来描述如何执行此类操作。