我有一个看起来像这样的初始熊猫数据框-每个单元格都是一个值列表 initial input
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'],
]
})
我想要这样格式化-对于每一行-列表的每个项目都构成一列,并针对所有重复/迭代执行此操作- desired output
我的原始输入数据集非常大-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')
有没有一种方法可以在更短的时间内实现这一目标,换句话说就是优化它?
答案 0 :(得分:1)
如果这是您的起始数据帧:
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)
答案 1 :(得分:0)
IIUC,您可以获得所需的结果。
输入
contrib
代码
group count value
0 [None, A, B, C, D] [None, None, None, None] [v, w, x, y, z]
1 [None, A1, B1, C1, D1] [None, None, None, None] [v1, w1, x1, y1, z1]
2 [None, A2, B2, C2, D2] [None, None, None, None] [v2, w2, x2, y2, z2]
输出
df1 = df.stack().droplevel(1).reset_index(name='col').drop('index',axis=1)
pd.DataFrame(df1['col'].values.tolist(), columns=['M','N','O','P','Q'])