python - 连接 1 行数据帧时的 Pandas 索引行为
问题描述
我对 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
我可以看到第一行中所有行的索引都是 0 pred_df
。但是我怎样才能避免这种情况发生呢?我猜.reset_index()
对所有事情都使用不是一个好习惯。
解决方案
根据@unutbu 的评论,您可以告诉 Pandas 在连接时忽略 index: pd.concat(pred_list, axis=0, ignore_index=True)
。以下是处理您的问题的更有效方法。
pd.DataFrame 的列表列表
您可以构造一个列表列表,然后将其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
推荐阅读
- rest - HTTPS 记录查询说明
- excel - 比较 2 个范围将新项目添加到范围末尾
- c++ - 指针值改变 C++
- azure - 将 EPiserver 媒体 blob 迁移到 Azure 存储帐户
- nservicebus - 使用 Nservicebus 向远程 MSMQ 发送消息
- python - 绘制具有两列索引的数据框并显示 x-tick 值
- javascript - 即使 str1 不等于 str2,expect(str1).to.equal(str2) 也会通过
- git - 在没有存储/提交的情况下在两个分支上切换分支时忽略本地更改
- mysql - Mysql - 计数行直到达到第一个不同的值
- c# - 使用 SOAP Web 服务,“未提供服务证书。在 ServiceCredentials 中指定服务证书。”