python - 使用来自另一个数据帧的各种值创建一个新的数据帧
问题描述
我有一个带有一些参考值的数据框:
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)
在这种情况下,我似乎无法开始工作。注意:我正在使用的实际数据帧要大一些。
提前致谢。
解决方案
我认为你可以使用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
推荐阅读
- python - 我需要配置什么才能在浏览器上运行 Python?
- google-chrome-extension - Facebook 页面插件 Manifest V3 中的内容安全策略
- html - 标头不断从极右端出来
- quicksort - 快速排序实现不适用于大输入
- excel - 使用索引和匹配公式时返回错误
- python - 如何从给定的概率分布中采样?
- spring-boot - 如何从分区分配器的实现中调用 kafkaconsumer api
- c - 为什么UP不需要内存屏障?
- html - 拖放 - 拖放时合并行 - Angular
- python - 如何在 python3.6 中使用 ImageTk 和 Tkinter 修复 AttributeError?