【发布时间】:2021-06-28 04:35:45
【问题描述】:
我有一个丑陋的数据源,我正在尝试清理它。我不能使源更清洁,我是这样接收的。我正在使用 Python 和 Pandas 数据框。第一列包含一个带有日期时间对象的单元格,然后是几个带有字符串的单元格,然后是另一个日期时间对象,然后是更多字符串。字符串的数量未知。
我想将每组数据放入自己的数据框中,以便我可以将每组整齐地导出到电子表格中的单独工作表中,这是该项目所必需的。
所以,输入数据框的第一列是这样的:
df[col1]
-----
datetime.datetime.strptime('06/23/2021', "%m/%d/%Y")
'tony'
'nikki'
'james'
datetime.datetime.strptime('06/24/2021', "%m/%d/%Y")
'amy'
'jose'
datetime.datetime.strptime('06/25/2021', "%m/%d/%Y")
'tony'
'jose'
'eddie'
'anna'
我想把它分成几个这样的数据框:
df1[col1]
-----
'tony'
'nikki'
'james'
df2[col1]
-----
'amy'
'jose'
df3[col1]
-----
'tony'
'jose'
'eddie'
'anna'
我不知道该怎么做,而不仅仅是遍历行,我知道这是使用 pandas 时的最后手段。
遍历行就像(这是伪代码,因为这是我努力的一部分)
strRows = []
dfs = []
for index,row in df.iterrows():
while row not contain datetime object:
# append row to list to add to new dataframe
strRows.append(row)
# create new dataFrame with saved rows
newDF = pd.DataFrame(strRows)
dfs.append(newDF)
虽然最终我想保留日期信息并在该日期之后命名新数据框,但现在我只关心提取行。
我的问题:df.iterrows() 是解决这个问题的好方法,还是有一种优先的非迭代方法?
感谢任何建议。谢谢。
编辑:
根据这里的建议和更一般的搅动,我最终以这种方式创建了一个包含日期本身的新列。
df["Day"] = pd.to_datetime(df['Col1'], errors='coerce').fillna(method='ffill')
errors='coerce' 在解析“NaT”结果时出错,fillna(method='ffill') 使日期填满整个列。这一点很重要,特别是因为 Col1 包含日期时间和字符串,所以当to_datetime 遇到字符串时,我希望它给出NaT,以便fillna 可以使用ffill 来填写日期时间.
然后,由于我的最终目标实际上是在电子表格中创建工作表,而不是单独的数据框,因此我使用由 groupby 创建的字典直接写入我的 xlsx。
df_days = {key: value for (key, value) in df.groupby('Day')}
with writer as writer:
for key in df_days:
df_days[key].to_excel(writer, key, index=False)
【问题讨论】: