【问题标题】:KeyError when applying a function to pandas dataframe将函数应用于熊猫数据框时出现KeyError
【发布时间】:2021-08-27 13:46:39
【问题描述】:

我最初有一个包含两列的数据框。“Col 1”对于整个数据集只有两个值 - X 和 Y。在此示例中,我希望“Col 3”的值用 1 填充索引“3”索引“7”。然后索引'9'到索引'10'用2填充,索引'12'用3填充。所以基本上对于X中的每一个变化,我喜欢在'Col2'中填充它的对应值新列 'Col 3' 如下例所示:

我已在 Pandas 中应用此代码

col3 = pd.Series([], dtype='float')
count = 0
i = 0
while count < len(df):
    if ~df['col2'][count].startswith('A'):
        d_value = df['col2'][count]
        if i != len(df)-1:
            while df['col1'][i+1] != 'X':
                col3[i + 1] = d_value
                i = i + 1
    count = i + 1
    i = i + 1
    

df.insert(loc=1, column = 'Col 3', value = col3 )

但我收到一个不太清楚的错误。

如果我应用于数据子集(例如:500 行),则该代码有效,但如果我应用于整个数据集,则会出现错误。我在这做错了什么?

【问题讨论】:

标签: python pandas jupyter-notebook


【解决方案1】:

把概念模型改成向量,不用循环就可以实现。

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        "Col1": ["X", "Y", "Y", "Y", "Y", "Y", "X", "Y", "Y", "X", "Y"],
        "Col2": [1, "A11", "A12", "A13", "A14", "A15", 2, "A16", "A17", 3, "A18"],
    }
)

# copy across X value to Y for Col3 for first Y row
df = df.assign(
    Col3=np.where(
        df["Col1"].eq("Y"),
        np.where(df["Col1"].shift().eq("X"), df["Col2"].shift(), np.nan),
        np.nan,
    )
)
# complete the Y-rows
df.loc[df["Col1"].eq("Y"), "Col3"] = df.loc[df["Col1"].eq("Y"), "Col3"].fillna(method="ffill")

df

输出

Col1 Col2 Col3
0 X 1 nan
1 Y A11 1
2 Y A12 1
3 Y A13 1
4 Y A14 1
5 Y A15 1
6 X 2 nan
7 Y A16 2
8 Y A17 2
9 X 3 nan
10 Y A18 3

【讨论】:

    猜你喜欢
    • 2021-09-17
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2013-08-10
    • 2021-02-12
    • 2012-09-06
    相关资源
    最近更新 更多