Pandas数据帧将一行中的一个值映射到另一个值



我有两个panda数据帧,其中一个数据帧的列为"名称"、"年份"one_answers"汇率"。

另一个列名为"名称",还有一长串年份(1950年、1951年、……、20192020年(。

在"年份"栏中,它存储了2000、2001、…、,。。。,2015年。年份(1950年、1951年、……、20192020(列存储当年的收入。

我想合并这两个数据帧,但根据"年份"列将当年的收入映射到一个名为"收入"的新列,并删除所有其他年份,有方便的方法吗?

我想的是将第二个数据帧划分为16个不同的年份,然后将其加入第一个数据帧。

更新以反映OP澄清问题的评论

根据我最新的理解重述这个问题:

  • 有一个数据帧,包含列Name、Year和Currency Rate(共3列(。每一行都包含给定名称在给定年份的汇率。每一行都是唯一的(名称,年份(对
  • 存在第二个数据帧,其列为Name,19501951。。。,2020(共72栏(。每个单元格都包含行对应名称的Income值和列名对应的Year。每一行的名称都是唯一的
  • 问题:我们如何在第一个数据帧中添加一个Income列,每一行都包含单元格中第二个数据帧的Income值,其中(row,column(对应于第一个数据框中这一行的(Name,Year(对

我所做的测试用例假设:

  • 第一个数据帧中的名称是一个从"a"到"n"的字母,其中有一些重复项
  • 第一个数据帧的年份在2000年到2015年之间(如问题所述(
  • 第一个数据帧中的汇率是任意的
  • 第二个数据帧中的名称是从"a"到"z"的一个字母(没有重复(
  • 第二个数据帧中的值(表示收入(是使用与相应列名的年份连接的相应名称中的字符的ASCII偏移量任意构建的。通过这种方式,我们可以在视觉上";解码";以确认来自第二数据帧中正确位置的值已加载到第一数据帧中的新收入列中
table1 = [
{'Name': 'a', 'Year': 2000, 'Currency Rate': 1.1},
{'Name': 'b', 'Year': 2001, 'Currency Rate': 1.2},
{'Name': 'c', 'Year': 2002, 'Currency Rate': 1.3},
{'Name': 'd', 'Year': 2003, 'Currency Rate': 1.4},
{'Name': 'e', 'Year': 2004, 'Currency Rate': 1.5},
{'Name': 'f', 'Year': 2005, 'Currency Rate': 1.6},
{'Name': 'g', 'Year': 2006, 'Currency Rate': 1.7},
{'Name': 'h', 'Year': 2007, 'Currency Rate': 1.8},
{'Name': 'i', 'Year': 2008, 'Currency Rate': 1.9},
{'Name': 'j', 'Year': 2009, 'Currency Rate': 1.8},
{'Name': 'k', 'Year': 2010, 'Currency Rate': 1.7},
{'Name': 'l', 'Year': 2011, 'Currency Rate': 1.6},
{'Name': 'm', 'Year': 2012, 'Currency Rate': 1.5},
{'Name': 'm', 'Year': 2013, 'Currency Rate': 1.4},
{'Name': 'n', 'Year': 2014, 'Currency Rate': 1.3},
{'Name': 'n', 'Year': 2015, 'Currency Rate': 1.2}
]
table2 = [{'Name': name} | {str(year): (income := sum(ord(c) - ord('a') + 1 for c in name)*10000 + year) for year in range(1950, 2021)} for name in set(['x', 'y', 'z']) | set(map(lambda row: row['Name'], table1))]
import pandas as pd
df1 = pd.DataFrame(table1)
df2 = pd.DataFrame(table2).sort_values(by='Name')
print(df1)
print(df2)
df1['Income'] = df1.apply(lambda x: int(df2[df2['Name'] == x['Name']][str(x['Year'])]), axis=1)
print(df1.to_string(index=False))

输出:

Name  Year  Currency Rate
0     a  2000            1.1
1     b  2001            1.2
2     c  2002            1.3
3     d  2003            1.4
4     e  2004            1.5
5     f  2005            1.6
6     g  2006            1.7
7     h  2007            1.8
8     i  2008            1.9
9     j  2009            1.8
10    k  2010            1.7
11    l  2011            1.6
12    m  2012            1.5
13    m  2013            1.4
14    n  2014            1.3
15    n  2015            1.2
Name    1950    1951    1952    1953    1954    1955    1956    1957    1958    1959    1960  ...    2009    2010    2011    2012    2013    2014    2015    2016    2017    2018    2019    2020
11    a   11950   11951   11952   11953   11954   11955   11956   11957   11958   11959   11960  ...   12009   12010   12011   12012   12013   12014   12015   12016   12017   12018   12019   12020
15    b   21950   21951   21952   21953   21954   21955   21956   21957   21958   21959   21960  ...   22009   22010   22011   22012   22013   22014   22015   22016   22017   22018   22019   22020
0     c   31950   31951   31952   31953   31954   31955   31956   31957   31958   31959   31960  ...   32009   32010   32011   32012   32013   32014   32015   32016   32017   32018   32019   32020
10    d   41950   41951   41952   41953   41954   41955   41956   41957   41958   41959   41960  ...   42009   42010   42011   42012   42013   42014   42015   42016   42017   42018   42019   42020
9     e   51950   51951   51952   51953   51954   51955   51956   51957   51958   51959   51960  ...   52009   52010   52011   52012   52013   52014   52015   52016   52017   52018   52019   52020
1     f   61950   61951   61952   61953   61954   61955   61956   61957   61958   61959   61960  ...   62009   62010   62011   62012   62013   62014   62015   62016   62017   62018   62019   62020
4     g   71950   71951   71952   71953   71954   71955   71956   71957   71958   71959   71960  ...   72009   72010   72011   72012   72013   72014   72015   72016   72017   72018   72019   72020
3     h   81950   81951   81952   81953   81954   81955   81956   81957   81958   81959   81960  ...   82009   82010   82011   82012   82013   82014   82015   82016   82017   82018   82019   82020
2     i   91950   91951   91952   91953   91954   91955   91956   91957   91958   91959   91960  ...   92009   92010   92011   92012   92013   92014   92015   92016   92017   92018   92019   92020
13    j  101950  101951  101952  101953  101954  101955  101956  101957  101958  101959  101960  ...  102009  102010  102011  102012  102013  102014  102015  102016  102017  102018  102019  102020
14    k  111950  111951  111952  111953  111954  111955  111956  111957  111958  111959  111960  ...  112009  112010  112011  112012  112013  112014  112015  112016  112017  112018  112019  112020
12    l  121950  121951  121952  121953  121954  121955  121956  121957  121958  121959  121960  ...  122009  122010  122011  122012  122013  122014  122015  122016  122017  122018  122019  122020
5     m  131950  131951  131952  131953  131954  131955  131956  131957  131958  131959  131960  ...  132009  132010  132011  132012  132013  132014  132015  132016  132017  132018  132019  132020
7     n  141950  141951  141952  141953  141954  141955  141956  141957  141958  141959  141960  ...  142009  142010  142011  142012  142013  142014  142015  142016  142017  142018  142019  142020
8     x  241950  241951  241952  241953  241954  241955  241956  241957  241958  241959  241960  ...  242009  242010  242011  242012  242013  242014  242015  242016  242017  242018  242019  242020
6     y  251950  251951  251952  251953  251954  251955  251956  251957  251958  251959  251960  ...  252009  252010  252011  252012  252013  252014  252015  252016  252017  252018  252019  252020
16    z  261950  261951  261952  261953  261954  261955  261956  261957  261958  261959  261960  ...  262009  262010  262011  262012  262013  262014  262015  262016  262017  262018  262019  262020
[17 rows x 72 columns]
Name  Year  Currency Rate  Income
a  2000            1.1   12000
b  2001            1.2   22001
c  2002            1.3   32002
d  2003            1.4   42003
e  2004            1.5   52004
f  2005            1.6   62005
g  2006            1.7   72006
h  2007            1.8   82007
i  2008            1.9   92008
j  2009            1.8  102009
k  2010            1.7  112010
l  2011            1.6  122011
m  2012            1.5  132012
m  2013            1.4  132013
n  2014            1.3  142014
n  2015            1.2  142015

最新更新