首页 > 解决方案 > 连接 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()对所有事情都使用不是一个好习惯。

标签: pythonpython-3.xpandasdataframe

解决方案


根据@unutbu 的评论,您可以告诉 Pandas 在连接时忽略 index: 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

推荐阅读