给定一个包含与一年中几个月相关的列的数据帧,我需要对此数据帧的每月切片执行一系列相同的操作,并为包含原始值的每个月期间的输出数据帧以及包含这些值的列从对相关切片执行的操作返回。
问题是如何设置这些切片(之后可以对数据帧执行操作),而不必定义与特定月份相关的每个数据帧(解决方案需要灵活以适应不断变化的时期)。
输入:
df_a_number
Index 21-Nov 21-Dec 22-Jan 22-Feb
John 2 3 1 5
Anna 1 4 3 8
df_b_letter
Index 21-Nov 21-Dec 22-Jan 22-Feb
John a f j p
Anna b b w g
期望的输出:
df_dec
Index 21-Nov 21-Dec 21-Dec-Diff 21-Dec-Letter
John 2 3 1 f
Anna 1 4 3 b
df_jan
Index 21-Dec 21-Jan 22-Jan-Diff 22-Jan-Letter
John 3 1 -2 j
Anna 4 3 -1 w
二月份依此类推...
除了在-Diff
列中进行计算和在-Letter
列中进行合并之外,在输出到文件之前还需要对df进行过滤。
如有任何建议或想法,我们将不胜感激。
最佳答案
首次使用concat
差异为 DataFrame.diff
:
df = pd.concat([df_a_number,
df_a_number.diff(axis=1).iloc[:, 1:].add_suffix('-Diff'),
df_b_letter.iloc[:, 1:].add_suffix('-Letter')], axis=1)
print (df)
21-Nov 21-Dec 22-Jan 22-Feb 21-Dec-Diff 22-Jan-Diff 22-Feb-Diff \
Index
John 2 3 1 5 1 -2 4
Anna 1 4 3 8 3 -1 5
21-Dec-Letter 22-Jan-Letter 22-Feb-Letter
Index
John f j p
Anna b w g
为 DataFrames 字典添加上个月的解决方案:
d = {b: df.filter(regex=rf'^{a}$|{b}') for a, b
in zip(df_a_number.columns, df_a_number.columns[1:])}
# print (d)
print (d['21-Dec'])
21-Nov 21-Dec 21-Dec-Diff 21-Dec-Letter
Index
John 2 3 1 f
Anna 1 4 3 b
print (d['22-Jan'])
21-Dec 22-Jan 22-Jan-Diff 22-Jan-Letter
Index
John 3 1 -2 j
Anna 4 3 -1 w
编辑:可能的解决方案,但不推荐 with globals :
for a, b in zip(df_a_number.columns, df_a_number.columns[1:]):
globals()[f'df_{b}'.lower().replace('-','_')] = df.filter(regex=rf'^{a}$|{b}')
print (df_21_dec)
21-Nov 21-Dec 21-Dec-Diff 21-Dec-Letter
Index
John 2 3 1 f
Anna 1 4 3 b
关于python - Pandas:如何设置从单个数据帧切片的多个数据帧以对它们执行相同的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75810893/