python - Pandas:如何设置从单个数据帧切片的多个数据帧以对它们执行相同的操作

标签 python pandas dataframe

给定一个包含与一年中几个月相关的列的数据帧,我需要对此数据帧的每月切片执行一系列相同的操作,并为包含原始值的每个月期间的输出数据帧以及包含这些值的列从对相关切片执行的操作返回。

问题是如何设置这些切片(之后可以对数据帧执行操作),而不必定义与特定月份相关的每个数据帧(解决方案需要灵活以适应不断变化的时期)。

输入:

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/

相关文章:

python - 改进带有日期的对象列的性能过滤

python - 将给定行移动到 DataFrame 的末尾

python - pandas - 根据列值将每行复制 'n' 次

python - 从Pandas DataFrame创建Spark DataFrame

c++ - 交换两个序列的元素,使得元素和的差异最小。

python - 如何遍历两个 Pandas 列?

python - 根据 Pandas 中的另一个值更改一个值

python - 为列表中的句子创建单词词典

python - 拆分list的python列表

python - 由于 jsonschema,无法启动 jupyter notebook