python - 将列表转换为数据框时如何优化时间?

标签 python pandas dataframe numpy time

根据我之前的问题,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/

相关文章:

python - 如何使用 .corr() Pearson Correlation 获取 DataFrame 中两个选定列之间的相关性

python - 使用 Django 的用户模型后,我的数据填充不再起作用。为什么?

python-3.x - Bokeh Legend 对象 - 将指定的颜色传递给图例

pandas - 如何设置列为日期索引?

python - kaggle 脚本编辑器中来自 OpenCV 的 SIFT

python - 使用 pandas 操作创建派生列

python - Pandas :按包含 nan 的列的多个条件过滤数据框

r - R中如何使用for循环保存和写入文件

python - 使用一行访问 Pandas 数据框中的数据

python - 从字符串 python 中删除\xe2\x80\xa6