我有看起来像这样的初始熊猫数据框 - 每个单元格都是初始输入的值列表
Python 脚本 - 获取初始数据帧 - 就像 Ian Thompson 在这个答案中提到的那样 -
import pandas as pd
df_out1 = pd.DataFrame({
0: [
[None, 'A', 'B', 'C', 'D'],
[None, 'A1', 'B1', 'C1', 'D1'],
[None, 'A2', 'B2', 'C2', 'D2'],
],
1: [
[None] * 5,
[None] * 5,
[None] * 5,
],
2: [
['V', 'W', 'X', 'Y', 'Z'],
['V1', 'W1', 'X1', 'Y1', 'Z1'],
['V2', 'W2', 'X2', 'Y2', 'Z2'],
]
})
我想像这样格式化 - 对于每一行 - 列表的每个项目形成一列,并为所有重复/迭代执行此操作 -所需的输出
我的原始输入数据集很大 - 10,000 行和 40 列。我在 python 脚本下执行 - 尽管它正在工作并提供所需的输出 - 当我运行它 2000 行和 40 列时 - 运行时间接近 1800 秒,我认为这是在更高的一侧。
Python 脚本:df_out1 是初始数据帧
d = pd.DataFrame()
for x in range(len(df_out1)):
for y in range(len(df_out1.columns)):
d = d.append(pd.Series(df_out1[y][x]), ignore_index=True)
d.to_csv('inter_alm_output_' + str(time.strftime("%Y%m%d-%H%M%S")) + '.csv')
有没有办法在更短的时间内实现这一目标,换句话说,优化它?
如果这是您的起始数据框:
df = pd.DataFrame({
0 : [
[None, 'A', 'B', 'C', 'D'],
[None, 'A1', 'B1', 'C1', 'D1'],
[None, 'A2', 'B2', 'C2', 'D2'],
],
1 : [
[None]*5,
[None]*5,
[None]*5,
],
2 : [
['V', 'W', 'X', 'Y', 'Z'],
['V1', 'W1', 'X1', 'Y1', 'Z1'],
['V2', 'W2', 'X2', 'Y2', 'Z2'],
]
})
您可以通过应用pd.Series
和连接结果来重新格式化列。
print(pd.concat([
df[i].apply(pd.Series) for i in df.columns
]).sort_index().reset_index(drop=True))
0 1 2 3 4
0 None A B C D
1 None None None None None
2 V W X Y Z
3 None A1 B1 C1 D1
4 None None None None None
5 V1 W1 X1 Y1 Z1
6 None A2 B2 C2 D2
7 None None None None None
8 V2 W2 X2 Y2 Z2
另一种不使用的方法pd.concat
:
print(df.stack().reset_index(drop=True).apply(pd.Series))
0 1 2 3 4
0 None A B C D
1 None None None None None
2 V W X Y Z
3 None A1 B1 C1 D1
4 None None None None None
5 V1 W1 X1 Y1 Z1
6 None A2 B2 C2 D2
7 None None None None None
8 V2 W2 X2 Y2 Z2
第一种方法在
3.93 ms ± 154 µs per loop (mean ± std. dev. of 7 runs, 100 loops each
第二种方法在
2.34 ms ± 66.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
您的原始代码完成于
15 ms ± 340 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句