串联1行数据帧时的熊猫索引行为

时间:2018-07-10 17:30:52

标签: python python-3.x pandas dataframe

我是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()并不是养成的好习惯。

1 个答案:

答案 0 :(得分:2)

根据@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