首页 > 解决方案 > 使用来自另一个数据帧的各种值创建一个新的数据帧

问题描述

我有一个带有一些参考值的数据框:

ref_value = {A:111, B:222, C:333, D:444}
df = pd.DataFrame(ref_value)

|foo|bar|
|---|---|
|A  |111|
|B  |222|
|C  |333|
|D  |444|

然后我想用它来创建一个更大的数据集,如下所示:

| x | y |
|---|---|
|1  |111|
|2  |111|
|3  |111|
|4  |111|
|5  |111|
|6  |222|
|7  |222|
|8  |222|
|9  |222|
|10 |222|
|11 |333|
|12 |333|
|13 |333|
|14 |333|
|15 |333|
|16 |444|
|17 |444|
|18 |444|
|19 |444|
|20 |444|

这就是我的做法:

new_df = pd.DataFrame(np.arange(20))

new_df.loc[new_df.x <= 5, 'y'] = df.loc[df.foo == 'A', 'bar'].iloc[0]
new_df.loc[(new_df.x > 5) & (new_df.x <= 10), 'y'] = df.loc[df.foo == 'B', 'bar'].iloc[0]
new_df.loc[(new_df.x > 10) & (new_df.x <= 15), 'y'] = df.loc[df.foo == 'C', 'bar'].iloc[0]
new_df.loc[new_df.x > 15, 'y'] = df.loc[df.foo == 'D', 'bar'].iloc[0]

我可以就如何更轻松/优雅地做到这一点提出一些建议吗?

df.apply(lambda x: function)在这种情况下,我似乎无法开始工作。注意:我正在使用的实际数据帧要大一些。

提前致谢。

标签: pythonpandasdataframe

解决方案


我认为你可以使用pd.Series.apply如下:

import pandas as pd
import numpy as np
def replace_values(v, ref_values):
    if v <= 5:
        return ref_values["A"]
    elif 5 < v <= 10:
        return ref_values["B"]
    elif 10 < v <= 15:
        return ref_values["C"]
    elif 15 < v:
        return ref_values["D"]
    return np.nan

if __name__ == '__main__':
    ref_value = {"A":111, "B":222, "C":333, "D":444}
    new_df = pd.DataFrame({"x": range(1,21)})
    new_df["y"] = new_df["x"].apply(lambda v: replace_values(v, ref_value))
    print(new_df)

结果:

     x    y
0    1  111
1    2  111
2    3  111
3    4  111
4    5  111
5    6  222
6    7  222
7    8  222
8    9  222
9   10  222
10  11  333
11  12  333
12  13  333
13  14  333
14  15  333
15  16  444
16  17  444
17  18  444
18  19  444
19  20  444

推荐阅读