Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-如何有条件地将列附加到数据帧?_Python_Pandas_Dataframe - Fatal编程技术网

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
    列不包含(四位数)数字,则该行的
    Lifespan
    列将填充“N/a”(或
    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经验来了解为什么您的解决方案更高效。由于矢量化,在列上执行操作比在行上执行操作快。