尝试按 Pandas 中的日期对单元格中的数据进行排序
Trying Sort Data in a Cell by Date in Pandas
我有一个数据集,在一列中,每个单元格都包含混合了字符串和日期的数据,如下所示
AE
2018-04-30 10:28, Bokning, Johan Skoglund, 1295 imkanal
2019-08-12 15:27, CrossNej, nan, nan
2020-06-25 18:21, CrossNej, nan, nan
:----
2018-09-13 12:25, Bokning, Simon Wallin, 2195 im och frånluften
2019-07-26 16:26, CrossNej, nan, nan
2020-09-01 14:49, RetentionTelsvarare, nan, nan
:----
2019-02-25 14:00, Bokning, Jan Gunnarsson, Imkanal 1495 kr
2019-11-07 15:39, CrossNej, nan, nan
2020-01-14 17:52, CrossNej, nan, nan
2020-12-16 11:14, CrossRensat 12 mån, nan, nan
我想做的是按 日期 降序排列每个单元格中的值(从高到低)。我已经尝试了几乎所有在线提供的解决方案,但我一直无法这样做。它要么只是一个日期,要么只是一个字符串。我按换行符拆分它
main_df["Log"] = outputdf["Log"].map(lambda x: '\n'.join(sorted(x.split('\n'))))
然后我通过将附加设置设置为假来对其进行排序。但是数据并没有因此改变
main_df.explode('Log').sort_values(by='Log', ascending=False, inplace=True)
main_df = main_df.replace(np.nan,0)
然后我试了这个
main_df.loc[np.argsort(main_df.Log.str.split('-').str[-1].astype(int).values)]
和
main_df = main_df.reindex(main_df['Log'].str.extract('(\d+)', expand=False).astype(int).sort_values(ascending=False).index).reset_index(drop=True)
但我明白了
ValueError: invalid literal for int() with base 10
还有这个
python int too large to convert to c long
也试过
main_df['Log'] = pd.to_datetime(main_df['Log'])
main_df = main_df.sort_values(by=['Log'], ascending=False)
但似乎没有任何效果。请帮我解决这个问题。提醒一下,3 个块中的每个块代表我列中的一个单元格。我想在一个单元格而不是整个单元格中组织数据 table。
你描述的问题和预期结果不是很清楚,我只能自己猜测,试试下面的代码:
def handle(s: str):
f = pd.Series(s.split('\n')).str.split(r',', n=1, expand=True)
f['tmp'] = pd.to_datetime(f[0])
f = f.sort_values('tmp', ascending=False)
res = f[0].str.cat(f[1], sep=', ').str.cat(sep='\n')
return res
res = main_df.log.apply(handle)
print(res)
我的建议是先将您的 AE 列转换为一个数组,我相信该数组将如下所示。
array = ['2018-04-30 10:28,Bokning,Johan Skoglund,1295 imkanal',
'2019-08-12 15:27, CrossNej, nan, nan',
'2020-06-25 18:21, CrossNej, nan, nan']
一旦你转换成一个数组,你就可以运行 sorted函数。您的排序函数将如下所示。
sorted(array, reverse=True, key=lambda x: datetime.datetime.strptime(x.split(',')[0], '%Y-%m-%d %H:%M'))
reverse = True will use for descending.
我有一个数据集,在一列中,每个单元格都包含混合了字符串和日期的数据,如下所示
AE |
---|
2018-04-30 10:28, Bokning, Johan Skoglund, 1295 imkanal |
2019-08-12 15:27, CrossNej, nan, nan |
2020-06-25 18:21, CrossNej, nan, nan |
:---- |
2018-09-13 12:25, Bokning, Simon Wallin, 2195 im och frånluften |
2019-07-26 16:26, CrossNej, nan, nan |
2020-09-01 14:49, RetentionTelsvarare, nan, nan |
:---- |
2019-02-25 14:00, Bokning, Jan Gunnarsson, Imkanal 1495 kr |
2019-11-07 15:39, CrossNej, nan, nan |
2020-01-14 17:52, CrossNej, nan, nan |
2020-12-16 11:14, CrossRensat 12 mån, nan, nan |
我想做的是按 日期 降序排列每个单元格中的值(从高到低)。我已经尝试了几乎所有在线提供的解决方案,但我一直无法这样做。它要么只是一个日期,要么只是一个字符串。我按换行符拆分它
main_df["Log"] = outputdf["Log"].map(lambda x: '\n'.join(sorted(x.split('\n'))))
然后我通过将附加设置设置为假来对其进行排序。但是数据并没有因此改变
main_df.explode('Log').sort_values(by='Log', ascending=False, inplace=True)
main_df = main_df.replace(np.nan,0)
然后我试了这个
main_df.loc[np.argsort(main_df.Log.str.split('-').str[-1].astype(int).values)]
和
main_df = main_df.reindex(main_df['Log'].str.extract('(\d+)', expand=False).astype(int).sort_values(ascending=False).index).reset_index(drop=True)
但我明白了
ValueError: invalid literal for int() with base 10
还有这个
python int too large to convert to c long
也试过
main_df['Log'] = pd.to_datetime(main_df['Log'])
main_df = main_df.sort_values(by=['Log'], ascending=False)
但似乎没有任何效果。请帮我解决这个问题。提醒一下,3 个块中的每个块代表我列中的一个单元格。我想在一个单元格而不是整个单元格中组织数据 table。
你描述的问题和预期结果不是很清楚,我只能自己猜测,试试下面的代码:
def handle(s: str):
f = pd.Series(s.split('\n')).str.split(r',', n=1, expand=True)
f['tmp'] = pd.to_datetime(f[0])
f = f.sort_values('tmp', ascending=False)
res = f[0].str.cat(f[1], sep=', ').str.cat(sep='\n')
return res
res = main_df.log.apply(handle)
print(res)
我的建议是先将您的 AE 列转换为一个数组,我相信该数组将如下所示。
array = ['2018-04-30 10:28,Bokning,Johan Skoglund,1295 imkanal',
'2019-08-12 15:27, CrossNej, nan, nan',
'2020-06-25 18:21, CrossNej, nan, nan']
一旦你转换成一个数组,你就可以运行 sorted函数。您的排序函数将如下所示。
sorted(array, reverse=True, key=lambda x: datetime.datetime.strptime(x.split(',')[0], '%Y-%m-%d %H:%M'))
reverse = True will use for descending.