Python 使用行的值在pandas中创建新列

Python 使用行的值在pandas中创建新列,python,pandas,dataframe,Python,Pandas,Dataframe,首先,这不是复制品!我已经搜索了几个SO问题以及熊猫博士,但我没有找到任何结论!要创建具有行值的新列,请执行和 假设我有下表,打开一个.xls,我用它创建了一个数据帧。由于这是一个从real proble创建的小示例,因此我创建了一个简单的Excel表格,它可以轻松复制: 我现在想要的是找到包含“人口月-年”(我将查看不同的.xls,因此结构是相同的:人口、月和年 xls='population_example.xls' sheet_name='Sheet1' df = pd.read_exc

首先,这不是复制品!我已经搜索了几个SO问题以及熊猫博士,但我没有找到任何结论!要创建具有行值的新列,请执行和

假设我有下表,打开一个
.xls
,我用它创建了一个数据帧。由于这是一个从real proble创建的小示例,因此我创建了一个简单的Excel表格,它可以轻松复制:

我现在想要的是找到包含
“人口月-年”
(我将查看不同的
.xls
,因此结构是相同的:人口、月和年

xls='population_example.xls'
sheet_name='Sheet1'
df = pd.read_excel(xls, sheet_name=sheet_name, header=0, skiprows=2)
df
我想的是:

  • 使用
    startswith

  • 创建一列,对该值进行pythoning并获取月份和年份值

  • 我尝试过几种类似的方法:

    dff=df[s.str.startswith('Population')]
    dff
    
    但是错误不会停止。在上面的代码错误中,特别是:

    IndexingError:作为索引器提供的不可对齐的布尔序列(布尔序列的索引和索引对象的索引不匹配)

    我有几个猜测:

    • 尽管阅读了文档,我还是不太理解熊猫中的
      系列
      是如何工作的。我甚至没有想过要使用它们,但是
      启动时的
      看起来就像我正在寻找的东西
    • 如果处理得当,可能会出现
      NaN错误
      ,但我还不能使用
      df.dropna()
      ,因为我会丢失该行值(
      2017年4月人口
    编辑:

    使用此项的问题:

    df[df['Area'].str.startswith('Population')]
    是它将检查
    na值

    这是:

    df['Area'].str.startswith('Population')


    将给我一组真/假/na值,我不确定如何使用。

    多亏了@Erfan,我得到了解决方案:

    正确使用注释中的代码行,而不是像我尝试的那样,我设法:

    dff=df[df['Area'].str.startswith('Population',na=False)]
    dff

    这将产生:
    人口和家庭预测,2016年至2020年……南部

    现在我可以像这样访问这个值

    value=dff.iloc[0][0]
    值

    为了得到我想要的字符串:
    “人口和家庭预测,2016年至2041年,由人口专家.id编制,2019年4月。”

    我可以用python创建所需的列。谢谢!

    感谢@Erfan,我找到了解决方案:

    正确使用注释中的代码行,而不是像我尝试的那样,我设法:

    dff=df[df['Area'].str.startswith('Population',na=False)]
    dff

    这将产生:
    人口和家庭预测,2016年至2020年……南部

    现在我可以像这样访问这个值

    value=dff.iloc[0][0]
    值

    为了得到我想要的字符串:
    “人口和家庭预测,2016年至2041年,由人口专家.id编制,2019年4月。”
    我可以用它来创建所需的列。谢谢!

    您可以尝试:

    import pandas as pd
    import numpy as np
    
    pd.DataFrame({'Area': [f'Whatever{i+1}' for i in range(3)] + [np.nan, 'Population April 2017.'],
                  'Population': [3867, 1675, 1904, np.nan, np.nan]}).to_excel('population_example.xls', index=False)
    
    df = pd.read_excel('population_example.xls').fillna('')
    
    population_date = df[df.Area.str.startswith('Population')].Area.values[0].lstrip('Population ').rstrip('.').split()
    
    结果:

    ['April', '2017']
    
    或者(如果人口月年始终位于最后一行):

    你可以试试:

    import pandas as pd
    import numpy as np
    
    pd.DataFrame({'Area': [f'Whatever{i+1}' for i in range(3)] + [np.nan, 'Population April 2017.'],
                  'Population': [3867, 1675, 1904, np.nan, np.nan]}).to_excel('population_example.xls', index=False)
    
    df = pd.read_excel('population_example.xls').fillna('')
    
    population_date = df[df.Area.str.startswith('Population')].Area.values[0].lstrip('Population ').rstrip('.').split()
    
    结果:

    ['April', '2017']
    
    或者(如果人口月年始终位于最后一行):


    这里的
    s
    是什么?我想你想要
    df[df['Area'].str.startswith('Population')]
    但首先要将你的问题重新格式化,不要发帖。我们不能复制粘贴它来复制答案。你的预期输出是什么样子的?试试:
    df[df['Area'].str.startswith('Population'),na=False]
    要解决您的
    NaN
    问题,我们不需要csv。只要在这里发布一个示例数据集,阅读更多信息。在我的路上!感谢所有的反馈!不太习惯询问pandas@Erfan。开始时的技巧让我了解了整行内容!这里的
    s
    是什么?我想你想要
    df[df['Area']str.startswith('Population')]
    但首先,请以适当的格式重新格式化您的问题,不要发布。我们无法复制并粘贴该格式以复制答案。您的预期输出是什么样的?请尝试:
    df[df['Area'].str.startswith('Population'),na=False]
    要解决您的
    NaN
    问题,我们不需要csv。只需在此处发布一个示例数据集,阅读更多信息。在我的路上!感谢所有反馈!不太习惯询问pandas@Erfan。开始时的技巧让我了解了整行内容!您可能需要使用:
    df.loc[df['Area'].str.startswith('Population',na=False),'Area'].iat[0]
    这也会给你提供更好、更优化的值!非常感谢你对这个问题的耐心和愚蠢态度!@ErfanYou可能想使用:
    df.loc[df['Area'].str.startswith('Population',na=False),'Area'].iat[0]
    这也会给你带来价值,这实际上是更好、最好的!非常感谢你对这个问题的耐心和愚蠢的态度!@Erfan