尝试按 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.