python-如何有条件地将列附加到数据帧?
问题摘要:给定一个包含爵士乐音乐家姓名、乐器、出生日期和死亡日期基本数据的数据框python-如何有条件地将列附加到数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,问题摘要:给定一个包含爵士乐音乐家姓名、乐器、出生日期和死亡日期基本数据的数据框pDF,我想创建一个列,计算已经死亡的音乐家的寿命,或者为尚未死亡或没有死亡数据的音乐家返回“N/a” 说明:我正在做一个网络垃圾和数据分析项目,我在维基百科上搜寻爵士音乐家的基本信息(姓名、乐器、出生日期和死亡日期),以便创建一个数据库并进行一些数据分析。到目前为止,我已经成功构建了一个适用于钢琴家名单的脚本,并且作为测试,我已经构建了一个数据框架pDF,与“爵士乐音乐家名单”维基百科页面上的前30位音乐家一起。以
pDF
,我想创建一个列,计算已经死亡的音乐家的寿命,或者为尚未死亡或没有死亡数据的音乐家返回“N/a”
说明:我正在做一个网络垃圾和数据分析项目,我在维基百科上搜寻爵士音乐家的基本信息(姓名、乐器、出生日期和死亡日期),以便创建一个数据库并进行一些数据分析。到目前为止,我已经成功构建了一个适用于钢琴家名单的脚本,并且作为测试,我已经构建了一个数据框架pDF
,与“爵士乐音乐家名单”维基百科页面上的前30位音乐家一起。以下是pDF的当前状态:
Artist Instrument Birthdate Deathdate Birth Year \
0 Irving Aaronson Piano 1895 1963-03-10 1895
1 Anders Aarum Piano 1974-12-17 Present 1974
2 Mike Abene Piano 1942 Present 1942
3 Don Abney Piano 1923 2000-01-20 1923
4 Chris Abrahams Piano 1961 Present 1961
5 Muhal Richard Abrams Piano 1930-09-19 2017-10-29 1930
6 John Adriano Acea Piano 1917 1963 1917
7 Beegie Adair Piano 1937-12-11 Present 1937
8 Kei Akagi Piano 1953-03-16 Present 1953
9 Toshiko Akiyoshi Piano 1929-12-12 Present 1929
10 Erling Aksdal Jr. Piano 1953-02-18 Present 1953
11 Joe Albany Piano 1924-01-24 1988-01-12 1924
12 Tony Aless Piano 1921-08-28 1988-01-11 1921
13 Charlie Alexander Piano 1890 1970 1890
14 Joey Alexander Piano 2003-06-25 Present 2003
15 Monty Alexander Piano 1944-06-06 Present 1944
16 Sinan Alimanović Piano 1954-02-11 Present 1954
17 Esther Allan Piano 1914 1985 1914
18 Geri Allen Piano 1957 2017 1957
19 Steve Allen Piano 1921 2000 1921
20 Mose Allison Piano 1927-11-11 2016-11-15 1927
21 Mikhail Alperin Piano 1956-11-07 2018-05-11 1956
22 Helio Alves Piano 1966 Present 1966
23 Jimmy Amadie Piano 1937 2013 1937
24 Albert Ammons Piano 1907-03-01 1949-12-02 1907
25 Franck Amsallem Piano 1961-10-25 Present 1961
26 Chris Anderson Piano 1926-02-26 2008-02-04 1926
27 Bill Anschell Piano N/A N/A N/A
28 Jim Aton Double bass 1925 2008 1925
29 Ivar Antonsen Piano 1946-04-16 Present 1946
Death Year Lifespan
0 1963 NaN
1 Present NaN
2 Present NaN
3 2000 NaN
4 Present NaN
5 2017 NaN
6 1963 NaN
7 Present NaN
8 Present NaN
9 Present NaN
10 Present NaN
11 1988 NaN
12 1988 NaN
13 1970 NaN
14 Present NaN
15 Present NaN
16 Present NaN
17 1985 NaN
18 2017 NaN
19 2000 NaN
20 2016 NaN
21 2018 NaN
22 Present NaN
23 2013 NaN
24 1949 NaN
25 Present NaN
26 2008 NaN
27 N/A NaN
28 2008 NaN
29 Present NaN
表中除NaN
s之外的所有信息都是字符串
(我知道出生日期
和出生年份
和死亡日期
和死亡年份
基本上保留着相同的信息……这是我稍后将要完成的项目的一部分,但我还没有决定我要做什么。此外,数据框中的“N/A”表示信息可能不存在。)ot(无法通过web抓取脚本找到)
使用出生年份
和死亡年份
列中的年份日期,我想填写寿命
列的值,以便:
- 如果
列包含一个(四位数)数字,则该行的死亡年份
列将填充基本计算寿命
死亡年份-出生年份
- 如果
列不包含(四位数)数字,则该行的Death Year
列将填充“N/a”(或Lifespan
,以与数据帧语法保持一致-稍后我还必须在脚本中更改)NaN
for index, row in pDF.iterrows():
if (row['Birth Year'] != 'N/A') & (row['Death Year'] != 'Present'):
row['Birth Year'] = int(row['Birth Year'])
row['Death Year'] = int(row['Death Year'])
row['Lifespan'] = row['Death Year'] - row['Birth Year']
我的解决方案与我上面描述的逻辑不同,因为我不确定如何实现逻辑
以下是我的主要问题:
- 我在要点中所描述的逻辑是否是我能够实现我所尝试的最有效和最有说服力的方法?如果不是,还有什么更好的方法?我还试图找到一种方法,将
和出生年份
列中的所有四位数字重新键入整数,但我找不到这也是一个很好看的方法死亡年份
谢谢!我会将
标签保留在一旁,以便稍后重新整合。对于实际计算,我会将所有内容强制输入日期时间:
df['bday_dt'] = pd.to_datetime(df['Birthdate'], errors='coerce')
df['dday_dt'] = pd.to_datetime(df['Deathdate'], errors='coerce')
df['age_yrs'] = (df['bday_dt'] - df['dday_dt']).astype('timedelta64[Y]').astype(float)
然后使用一列,可能是alive
,由您的Deathdate
列构造而成,来说明音乐家是否还活着。如果您愿意,您可以从那里用np覆盖年龄列。其中alive
数据。为什么不直接为Present
输入NA
,然后减去across columns为什么建议对我的解决方案执行此操作?我根本不喜欢我的解决方案,我只是没有足够的Python经验来了解为什么您的解决方案更高效。由于矢量化,在列上执行操作比在行上执行操作快。