gpt4 book ai didi

python - 连接 1 行数据帧时的 Pandas 索引行为

转载 作者:太空宇宙 更新时间:2023-11-04 02:22:23 24 4
gpt4 key购买 nike

我对 python/pandas 比较陌生,无法理解 pandas 索引的工作原理。当我遍历数据框的行并创建具有相同行数的新数据框,然后尝试添加原始数据框中存在的系列时,添加的系列仅重复其第一个元素。

这是一个包含数据框内联打印的简单示例:

import pandas as pd

df = pd.DataFrame({'col1': range(1,6), 'col2': range(6,11), 'col3': range(11, 16)})

print(df)

col1 col2 col3
0 1 6 11
1 2 7 12
2 3 8 13
3 4 9 14
4 5 10 15

col3 = df.col3

iters = df.shape[0]
pred_list = []

for i in range(iters):
pred1 = df.loc[i,"col1"] + df.loc[i,"col2"]
pred2 = df.loc[i,"col1"] * df.loc[i,"col2"]
pred_row = pd.DataFrame([[pred1, pred2]], columns = ["p1", "p2"])
pred_list.append(pred_row)

pred_df = pd.concat(pred_list, axis = 0)

pred_df["col3"] = col3

print(pred_df)

p1 p2 col3
0 7 6 11
0 9 14 11
0 11 24 11
0 13 36 11
0 15 50 11

pred_df_reset = pred_df.reset_index()

pred_df_reset["col3"] = col3

print(pred_df_reset)

index p1 p2 col3
0 0 7 6 11
1 0 9 14 12
2 0 11 24 13
3 0 13 36 14
4 0 15 50 15

我可以看到第一个 pred_df 中所有行的索引都是 0。但是我怎样才能避免这种情况发生呢?我猜对所有内容都使用 .reset_index() 并不是一个好习惯。

最佳答案

根据@unutbu 的评论,您可以告诉 Pandas 在连接时忽略索引:pd.concat(pred_list, axis=0, ignore_index=True)。以下是处理您的问题的更有效方法。

列表列表到pd.DataFrame

您可以构造一个列表列表,然后将其直接提供给 pd.DataFrame 构造函数。这也会更有效率:list.appendpd.DataFrame.append 便宜。

col3 = df.col3
iters = df.shape[0]
pred_list = []

for i in range(iters):
pred1 = df.loc[i,"col1"] + df.loc[i,"col2"]
pred2 = df.loc[i,"col1"] * df.loc[i,"col2"]
pred_list.append([pred1, pred2])

pred_df = pd.DataFrame(pred_list, columns=["p1", "p2"])
pred_df["col3"] = col3

print(pred_df)

p1 p2 col3
0 7 6 11
1 9 14 12
2 11 24 13
3 13 36 14
4 15 50 15

矢量化方法

更重要的一点是您的操作可以矢量化以避免昂贵的手动循环:

s1 = df.col1 + df.col2
s2 = df.col1 * df.col2
s3 = df.col3

res = pd.concat([s1, s2, s3], axis=1)
res.columns = ['p1', 'p2', 'col3']

print(res)

p1 p2 col3
0 7 6 11
1 9 14 12
2 11 24 13
3 13 36 14
4 15 50 15

关于python - 连接 1 行数据帧时的 Pandas 索引行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51271142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com