Python 使用行的值在pandas中创建新列
首先,这不是复制品!我已经搜索了几个SO问题以及熊猫博士,但我没有找到任何结论!要创建具有行值的新列,请执行和 假设我有下表,打开一个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
.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
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