我是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()
并不是养成的好习惯。
答案 0 :(得分:2)
根据@unutbu的评论,您可以告诉Pandas在连接pd.concat(pred_list, axis=0, ignore_index=True)
时忽略索引。以下是解决问题的更有效方法。
您可以构造一个列表列表,然后将其直接提供给pd.DataFrame
构造函数。这样也会更有效:list.append
比pd.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