如何用字典值更新数据帧?

2024-06-28 10:50:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典,它有每个唯一键到每个唯一值的映射。我还有一个dataframe,其中有一列包含所有这些键(可能多次)。与键列相邻的列具有需要由与另一列中的键关联的值替换的值。在

我尝试过使用iloc、where和update,但似乎无法使其正常工作。在

df = pd.DataFrame({'1': ['A', 'B', 'C', 'D'],
                 '2': ["alpha", 2.34, 0, 4.1234],
                  '3': ["bravo", 20.123, 3.123123, 0],
                   '4': ["charlie", 20.123, 3.123123, 0],
                   '5': ["delta", 20.123, 3.123123, 0]},

                 index=['1', '2', '3', '4'])

还有字典

^{pr2}$
df = pd.DataFrame({'1': ['A', 'B', 'C', 'D'],
                 '2': ["2", "3", "5", "10"],
                  '3': [7, 20.123, 3.123123, 0],
                   '4': [9, 20.123, 3.123123, 0],
                   '5': [11, 20.123, 3.123123, 0]},

                 index=['1', '2', '3', '4'])

这是合并的预期输出。在


Tags: alphadataframedfindex字典updatewherepd
1条回答
网友
1楼 · 发布于 2024-06-28 10:50:08

你可以试试这样的方法:

df = pd.DataFrame(
    {
        "1": ["A", "B", "C", "D"],
        "2": ["alpha", 2.34, 0, 4.1234],
        "3": ["bravo", 20.123, 3.123123, 0],
        "4": ["charlie", 20.123, 3.123123, 0],
        "5": ["delta", 20.123, 3.123123, 0],
    },
    index=["1", "2", "3", "4"],
)

将索引重置为列1

^{pr2}$

使用Series而不是字典;它们或多或少相似。注意,我还将它命名为"2",因为我们要替换列2。在

d = pd.Series({"A": 2, "B": 3, "C": 5, "D": 10}, name="2")

您现在可以使用下面所示的两种方式之一加入。第一个保留了以_old为后缀的旧列,第二个只是删除它。在

df = df.join(d, lsuffix="_old")
df = df[["3", "4", "5"]].join(d)

如果要恢复数值索引,可以再次重置索引:

df = df.reset_index(drop=False)

以下是第一种连接方式的输出:

   1   2_old        3        4        5   2
0  A   alpha    bravo  charlie    delta   2
1  B    2.34   20.123   20.123   20.123   3
2  C       0  3.12312  3.12312  3.12312   5
3  D  4.1234        0        0        0  10

请注意,即使您的示例数据在1中没有重复的值,但上面的方法仍然有效。在

在预期结果数据框中,显示新列包含字符串而不是整数。如果这是您的期望,那么在join之前创建Series对象时需要提供字符串。在

d = pd.Series({"A": "2", "B": "3", "C": "5", "D": "10"}, name="2")

或者你可以在这之后改变它:

df["2"] = df["2"].astype("str")

编辑:由于运营商正在寻找一种更简洁的方法来实现这一点,一种变化可能是:

d = pd.Series({"A": "2", "B": "3", "C": "5", "D": "10"}, name="2")
df = df.join(d, on="1", lsuffix="_old")

编辑2:按照OP的建议,另一个选项是使用Series.map

d = {"A": "2", "B": "3", "C": "5", "D": "10"}
df["2"] = df["1"].map(d)

编辑3:我做了一个快速的性能测试,Series.map方法要快得多。在

In [34]: %timeit df.join(d, on="1", lsuffix="_old")                        
1.3 ms ± 58 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [35]: %timeit df["1"].map(d)      
214 µs ± 3.56 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

设置索引和连接,可以将join方法的性能提高一点:

In [40]: foo = df.set_index("1")     
In [41]: %timeit foo.join(d, lsuffix="_old")                               
818 µs ± 25.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

相关问题 更多 >