根据我之前的问题,How to fill the values in the list and convert it into the dataframe?
这可行,但对于大量数据会花费大量时间。
例如,我有一个数据框:
Id Name Photo1 Photo2
1 Mark 1.jpg 2.jpg
2 Julia 1.jpg
3 Andy 1.jpg 2.jpg
我试过:
import pandas as pd
df = pd.read_csv('PyCharmProjects/book1.csv')
df1 = df.reindex(['I','Id','Name','P','46','N','Photo1','Photo2','PH'],axis=1)
df1['I'] = df1['I'].fillna('I')
df1['P'] = df1['P'].fillna('P')
df1['46'] = df1['46'].fillna('46')
df1['N'] = df1['N'].fillna('N')
df1['PH'] = df1['PH'].fillna('PH')
df1 = df1.astype(str)
vals = [['I','Id'],['N','Name'],['P','46']]
photo_df = df1.fillna('').filter(like='Photo')
vals = [(i, y) for i, x in enumerate(photo_df.to_numpy())
for y in vals[:2] +[['PH',z]
for z in photo_df.columns[x!='']] +vals[2:]]
L = [df1.loc[df1.index[[i]], x].set_axis(range(len(x)), axis=1) for i, x in vals]
df1 = pd.concat(L)
df1
结果显示为:
I 1
Name Mark
PH 1.jpg
PH 2.jpg
P 46
I 2
Name Julia
PH 1.jpg
P 46
I 3
Name Andy
PH 1.jpg
PH 2.jpg
P 46
这很好用,但是当我尝试处理大型数据集时,这会花费大量时间。
这一行要花很多时间:
L = [df1.loc[df1.index[[i]], x].set_axis(range(len(x)), axis=1) for i, x in vals]
任何减少时间的想法或任何替代方法。
最佳答案
out = (df.assign(P=46)
.stack(dropna=False)
.reset_index(level=-1)
.set_axis([0, 1], axis=1)
.replace({0: {"Id": "I", "Name": "N", r"^Photo\d+$": "PH"}}, regex=True))
我们首先分配
一个值为46的列P
,然后堆叠
它同时保持NaN
,即,列在索引旁边,然后 reset_index
最后一级,即新出现的列成为它们自己的列,然后 set_axis
命名为 0, 1
的列。最后,在 0
列中执行所需的替换,将 "ID"
替换为 "I"
等
得到
0 1
0 I 1
0 N Mark
0 PH 1.jpg
0 PH 2.jpg
0 P 46
1 I 2
1 N Julia
1 PH 1.jpg
1 PH None
1 P 46
2 I 3
2 N Andy
2 PH 1.jpg
2 PH 2.jpg
2 P 46
关于python - 将列表转换为数据框时如何优化时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67682496/