我有一个看起来像这样的数据框:
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)
但这没用...
答案 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
可以识别的其他格式。
如果您希望E
是pandas
的真实数字,则需要将每个列表的每个条目扩展到其自己的列,以便存储实际的数字类型,而不是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
现在有了此参考框架,可以直接在此框架上使用min
和max
。与使用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