pandas - 运行时为 MultiIndex DataFrame 设置值变慢
问题描述
我有一个11729 rows × 8 columns
DataFrame,我想11729 × 30 × 8
用MultiIndex将它转换成一个矩阵,30表示每30行11729行,从0到11728 - 30
一个更简短的例子:
原始 2d DataFrame 如下所示:
col0 col1
0 1 2
1 3 4
2 5 6
3 7 8
4 9 10
我想要得到的 3d MultiIndex DataFrame 看起来像:
col0 col1
0 c0 1 2
c1 3 4
c2 5 6
1 c0 3 4
c1 5 6
c2 7 8
2 c0 5 6
c1 7 8
c2 9 10
这意味着(0,c0)~(0,c2)来自原始DataFrame中的0~2行,(1,c0)~(1,c2)来自原始DataFrame中的1~3行,(2,c0)~(2 ,c2) 来自原始 DataFrame 中的 2~4 行。
我正在使用以下代码将原始 2d DataFrame 转换为 MultiIndex 3d DataFrame:
multi_index = pd.MultiIndex(levels=[[],[]],
labels=[[],[]],
names=['', ''])
df = pd.DataFrame(index=multi_index, columns=origin_df.columns)
for i in range(n):
for j in range(i, len(origin_df) - (n - i)):
print("i{}/n{},j{}".format(i, n, j)) # print progress
df.loc[(j, 'c%d' % i), :] = origin_df.loc[origin_df.index[j]].tolist()
for i in range(n, len(origin_df)):
df.loc[(i, 'y'), :] = origin_df.loc[origin_df.index[i]].tolist()
return df
我的问题是运行时插入速度变慢。起初进度输出很快,但越来越慢。我该如何优化此操作?
解决方案
您不应该一一添加。这是我要做的:
# toy data:
df = pd.DataFrame(np.arange(11792*8).reshape(-1,8));
window = 30
new_len = len(df) - window + 1
# create new dataframe, ignoring the index
new_df = pd.concat(df.iloc[i:i+window] for i in range(new_len))
# modify the index
new_df.index = pd.MultiIndex.from_product([np.arange(new_len), [f'c{i}' for i in range(window)]])
在 6600k 上大约需要 1 秒。使用您的样本数据,输出为:
col0 col1
0 c0 1 2
c1 3 4
c2 5 6
1 c0 3 4
c1 5 6
c2 7 8
2 c0 5 6
c1 7 8
c2 9 10
推荐阅读
- python-3.x - 从先前创建的 keras-cnn-sequential 模型(测试)中重新训练的模型(测试新)减少了本地磁盘上的大小。这个对吗?
- c# - 使用asp.net插入数据时如何避免数据库中的不同记录?
- amazon-web-services - 从 S3 调用的 Amazon Rekognition index-faces 方法的常规模式错误
- javascript - 使用 mailgun API 如何使用日志事件之间的分页来获得总记录
- python - 如何制作碰撞遮罩?
- excel - 过滤 1 列并返回不同列中的所有关联记录
- c - 如何用另一个子字符串替换字符串的一部分
- r - How to match linked steps indicated by two columns of a data.table
- c# - C# 自定义 Json.NET 列表序列化
- php - 有没有办法在使用 php 检索后使用存储在 mysql 中的 PHP 代码?