转换数据框中具有值的列作为数字列表的列表

时间:2019-08-14 18:08:18

标签: python pandas type-conversion

我有一个看起来像这样的数据框:

    date         B  C   D   E
0   04/06/2019  258 994 761 [1, 46, 36, 7457, 456]
1   05/06/2019  748 181 565 [3453, 45]
2   07/06/2019  185 876 107 [4976, 46, 57, 7, 3]
3   08/06/2019  241 386 728 [4, 6457, 4]
4   09/06/2019  516 579 596 [65]

我想将df ['E']转换为数字数据类型。这样做的原因是我的目标是绘制E的最大值和一段时间内的平均值。

我已经尝试使用以下方法进行转换:

df['E'].infer_objects()
df['E'].astype(np.int16)

但这没用...

2 个答案:

答案 0 :(得分:3)

尝试一下。

df['E'].apply(lambda x:np.array(x,dtype=np.int32))

关于最大值和平均值

df['E_max'].apply(lambda x:x.max())
df['E_mean'].apply(lambda x:x.mean())

答案 1 :(得分:1)

infer_objects并不是您真正想的那样。来自docs

  

尝试对对象类型化的列进行软转换,而使非对象和不可转换列保持不变。推理规则与常规Series / DataFrame构造过程中的规则相同。

这只是检查对象列是否可以转换为数字或pandas可以识别的其他格式。


如果您希望Epandas的真实数字,则需要将每个列表的每个条目扩展到其自己的列,以便存储实际的数字类型,而不是Python对象。

E = pd.DataFrame(df.E.to_numpy().tolist())

      0       1     2       3      4
0     1    46.0  36.0  7457.0  456.0
1  3453    45.0   NaN     NaN    NaN
2  4976    46.0  57.0     7.0    3.0
3     4  6457.0   4.0     NaN    NaN
4    65     NaN   NaN     NaN    NaN

现在有了此参考框架,可以直接在此框架上使用minmax。与使用apply

的方法相比,使用矢量化的方法将更快
df.assign(**E.agg(['mean', 'max'], 1))

         date    B    C    D                       E    mean     max
0  04/06/2019  258  994  761  [1, 46, 36, 7457, 456]  1599.2  7457.0
1  05/06/2019  748  181  565              [3453, 45]  1749.0  3453.0
2  07/06/2019  185  876  107    [4976, 46, 57, 7, 3]  1017.8  4976.0
3  08/06/2019  241  386  728            [4, 6457, 4]  2155.0  6457.0
4  09/06/2019  516  579  596                    [65]    65.0    65.0