Python 从多个数据帧生成数据帧值
我正在尝试构建一个数据框架,其中的数据是从多个文件中抓取的。我已经创建了一个具有所需形状的空数据框,但在获取数据时遇到了问题。我发现,但当我发现时,我仍然得到NaN值。 Edit2:我更改了Python 从多个数据帧生成数据帧值,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试构建一个数据框架,其中的数据是从多个文件中抓取的。我已经创建了一个具有所需形状的空数据框,但在获取数据时遇到了问题。我发现,但当我发现时,我仍然得到NaN值。 Edit2:我更改了df创建的顺序,并将concat放入for循环中,得到了相同的结果。(理由显而易见) 两个示例数据帧:(注意不同的形状) 电流输出: 01-22-2020 01-23-2020 ... 04-09-2020 04-10-2020 World
df
创建的顺序,并将concat放入for循环中,得到了相同的结果。(理由显而易见)
两个示例数据帧:(注意不同的形状)
电流输出:
01-22-2020 01-23-2020 ... 04-09-2020 04-10-2020
World NaN NaN ... NaN NaN
Afghanistan NaN NaN ... NaN NaN
Albania NaN NaN ... NaN NaN
Algeria NaN NaN ... NaN NaN
Andorra NaN NaN ... NaN NaN
... ... ... ... ... ...
West Bank and Gaza NaN NaN ... NaN NaN
Western Sahara NaN NaN ... NaN NaN
Yemen NaN NaN ... NaN NaN
Zambia NaN NaN ... NaN NaN
Zimbabwe NaN NaN ... NaN NaN
[186 rows x 80 columns]
所需输出:(其中NaN等于目标列或所有列列表中的相应值,即:如果['confirm'],则为0,1,2,3,4,如果全部,则为[0,0,0],[1,0,0],[2,0,0])您的代码(内嵌注释):
将熊猫作为pd导入
导入操作系统
导入glob
def daily_country_framer():
#创建作业
country\u source=r“C:\Users\USER\PycharmProjects\Corona Stats\country Series”
文件列表=glob.glob(国家/地区\u来源+r“\*.csv”)
最新的\u文件=max(列出\u文件,key=os.path.getctime)
最后一帧=pd.read\u csv(最新的\u文件)
日期列表=[]
标签列表=[]
#生成日期列表值
对于os.listdir(国家/地区来源)中的文件:
file=file.replace('.csv','')
日期列表。追加(文件)
#构建国家/地区列表值
对于最后一帧['country']中的国家:#==最后一帧['country']。tolist()
标签列表。附加(国家)
#为文件夹中的每个文件创建数据帧
对于os.listdir(国家/地区来源)中的文件名:
filepath=os.path.join(国家/地区\来源,文件名)
如果不是os.path.isfile(文件路径):
持续
df1=pd.read\u csv(文件路径)
#为循环中的每个文件重新定义df1。所以如果有
#有10个文件,只有最后一个文件在任何地方实际使用
#在这个循环之外。
df=pd.DataFrame(索引=标签列表,列=日期列表)
df1=pd.concat([df])
#在这里,您刚刚再次将df1定义为
#您刚才在上面一行中创建的空数据帧。
打印(df1)
每日(国家)
希望这能说明为什么你会得到你想要的结果。它正在做你要求它做的事情
您要做的是获取一个字典,其中日期作为键,关联的数据帧作为值,然后将其连接起来。这可能会非常昂贵,因为pandas的连接方式有一些奇怪之处,但如果您沿axis=0进行连接,就可以了
更好的方法可能是:
将熊猫作为pd导入
导入操作系统
def daily_country_framer(国家/地区来源):
累加器={}
#生成日期列表值
对于os.listdir(国家/地区来源)中的文件名:
日期=文件名。替换('.csv','')
filepath=os.path.join(国家/地区\来源,文件名)
累加器[日期]=pd.read\u csv(文件路径)
#现在我们有了一个{date:data}字典——太完美了!
df=局部放电电流(蓄能器)
返回df
每日国家(C:\Users\USER\PycharmProjects\Corona Stats\country Series)
这行得通吗?也许通过外部合并(在国家/地区)?总之,您将更容易将您的最终df视为一个时间序列(意味着在当前输出中旋转一个),日期索引为datetime类型我尝试了
df=pd.DataFrame(index=label\u list,columns=date\u list)
,它返回时带有keyrerror:'Country'
。设置索引=['Country']
是否导致我的错误?尝试打印(键入(df['Country'])会返回相同的错误。哦,等等,你到底想实现什么?您能否提供一个所需输出的示例(因为您每天按国家/地区列出4列,最后每个国家/地区只有一个每日值)。顺便说一句,有些东西可能会帮助您在Python中浏览mergin:我试图为每个国家的每个日期找到相应的NaN值。每个值都可以是一个目标列,也可以是一个列表中的所有列值,以后可以对其进行索引<代码>世界-5-12-22-31;国家/地区1-0-0-1-1
Country Confirmed Deaths Recovered
0 World 1595350 95455 353975
1 Afghanistan 484 15 32
2 Albania 409 23 165
3 Algeria 1666 235 347
4 Andorra 583 25 58
.. ... ... ... ...
180 Vietnam 255 0 128
181 West Bank and Gaza 263 1 44
182 Western Sahara 4 0 0
183 Zambia 39 1 24
184 Zimbabwe 11 3 0
[185 rows x 4 columns]
Country Confirmed Deaths Recovered
0 World 1691719 102525 376096
1 Afghanistan 521 15 32
2 Albania 416 23 182
3 Algeria 1761 256 405
4 Andorra 601 26 71
.. ... ... ... ...
181 West Bank and Gaza 267 2 45
182 Western Sahara 4 0 0
183 Yemen 1 0 0
184 Zambia 40 2 25
185 Zimbabwe 13 3 0
[186 rows x 4 columns]
01-22-2020 01-23-2020 ... 04-09-2020 04-10-2020
World NaN NaN ... NaN NaN
Afghanistan NaN NaN ... NaN NaN
Albania NaN NaN ... NaN NaN
Algeria NaN NaN ... NaN NaN
Andorra NaN NaN ... NaN NaN
... ... ... ... ... ...
West Bank and Gaza NaN NaN ... NaN NaN
Western Sahara NaN NaN ... NaN NaN
Yemen NaN NaN ... NaN NaN
Zambia NaN NaN ... NaN NaN
Zimbabwe NaN NaN ... NaN NaN
[186 rows x 80 columns]