如何将每月列从一个数据框复制到另一个数据框

时间:2020-06-27 16:24:36

标签: python pandas

我想创建一个数据帧,该数据帧使用当年的月份加上上一年的月份,得出12。另外,由于要删除行,因此逐行检查并删除垃圾行。

两个Excel工作表已导入到数据框:

输入:df_ExcelSheet2019

           jan-19  feb-19  mar-19  apr-19  may-19  ...  sep-19  oct-19  nov-19  dec-19
row_name 1    0.1    0.12    0.55    0.54    0.44  ...    0.72    0.44    0.37    0.55
row_name 2    0.2    0.24    0.22    0.55    0.41  ...    0.66    0.15    0.51    0.42
row_name 3    0.3    0.54    0.65    0.32    0.38  ...    0.33    0.66    0.89    0.74
<garbage>
row_name 5    0.4    0.53    0.17    0.53    0.81  ...    0.73    0.44    0.16    0.21
row_name 6    0.5    0.55    0.75    0.83    0.48  ...    0.68    0.16    0.57    0.11

输入:df_ExcelSheet2020

           jan-20  feb-20  mar-20  apr-20  may-20  ...  sep-20  oct-20  nov-20  dec-20
row_name 1    0.1    0.12    0.55    0.54    0.44  ...    0.72    0.44    0.37    0.55
row_name 2    0.2    0.24    0.22    0.55    0.41  ...    0.66    0.15    0.51    0.42
row_name 3    0.3    0.54    0.65    0.32    0.38  ...    0.33    0.66    0.89    0.74
<garbage>
row_name 5    0.4    0.53    0.17    0.53    0.81  ...    0.73    0.44    0.16    0.21
row_name 6    0.5    0.55    0.75    0.83    0.48  ...    0.68    0.16    0.57    0.11 

所需结果:

df_final(例如,从2020年开始的前6个月,从2019年开始的最后6个月)

           jun-19  jul-19  aug-19  sep-19  oct-19  ...  feb-20  mar-20  apr-20  may-20
row_name 1    0.51   0.65    0.42    0.72    0.44  ...    0.12    0.55    0.54    0.44
row_name 2    0.32   0.78    0.61    0.66    0.15  ...    0.24    0.22    0.55    0.41
row_name 3    0.53   0.11    0.45    0.33    0.66  ...    0.54    0.65    0.32    0.38
row_name 4    0.74   0.12    0.68    0.73    0.44  ...    0.53    0.17    0.53    0.81
row_name 5    0.57   0.23    0.56    0.68    0.16  ...    0.55    0.75    0.83    0.48

代码:

row_data = []
#col - is an offset declared above based the Excel sheet structure
#currentYearFormat - a list of rows I want, garbage rows removed

for item in currentYearFormat:
    row = item[2] - 2 # 1 for 1to0 conversion and 1 because pandas ignores blank rows
    print("row: ",row)
    
    #copy elements from Previous sheet
    row_data = [df_previousYearOIR.iloc[row,col-previousYearMonths+12:col+12]]
    print("row name: " item[0])
    print("previous: \n", row_data)
    print("\n")
    #take elements from Current sheet and extend row_data
    row_data += [df_currentYearOIR.iloc[row,col:col+currentYearMonths]]
    print("extended: \n", row_data)

当前结果:

row: 2
row name: row_name 1
previous: 
 [Unnamed: 18    0.31
Unnamed: 19    0.38
Unnamed: 20    0.43
Unnamed: 21    0.72
Unnamed: 22    0.44
Unnamed: 23    0.37
Unnamed: 24    0.55
Name: 2, dtype: object]


extended: 
 [Unnamed: 18    0.31
Unnamed: 19    0.38
Unnamed: 20    0.43
Unnamed: 21    0.72
Unnamed: 22    0.44
Unnamed: 23    0.37
Unnamed: 24    0.55
Name: 2, dtype: object, Unnamed: 13     0.5
Unnamed: 14    0.1
Unnamed: 15    0.12
Unnamed: 16    0.55
Unnamed: 17    0.54
Name: 2, dtype: object]

2 个答案:

答案 0 :(得分:0)

您可以从2019 df和2020 df中选择所需的列,然后删除每个dfs中的垃圾行,然后合并这2个数据帧。或在加入2019 df和2020 df中的选定列后删除垃圾行。

current_month = datetime.datetime.today().month
joined_df = pd.concat([df_2019[df_2019.columns[current_month:]], df_2020[df_2020.columns[:current_month]]], axis=1)

有了这个,您就可以应用逻辑来删除垃圾,创建布尔掩码并从此加入的df中消除垃圾行。

joined_df['garbage'] = <apply some logic to identify garbage rows>
final_df = joined_df[joined_df['garbage']==False]

答案 1 :(得分:0)

您的每月数据实际上在 中,而不是行中。因此,您真的想对2020年1月6日的 进行切片,并将其按列pd.concat(..., axis=1)连接到2019年7月至12月的列。

  • 否则,由于一般的熊猫(和大多数数据科学工具)使用行而不是列来进行操作要容易得多,因此如果 转置 pd.read_excel(...).T中读取数据框时,会立即显示。这就是.T或等效的.transpose()函数。现在每个月的数据都在 中。

  • 实际上,当您在以下位置读取两个数据框时,也可以合并它们:

    df_all90 = pd.concat([pd.read_excel('<2019.xls>'), pd.read_excel('<2020.xls>')], axis=1).T

  • 现在剩下的就是对感兴趣的行进行切片:

    df = df_all90.loc[['jul-19','aug-19',...,'dec-19','jan-20',...,'jun-20']]df.iloc[i:j]来获取一对整数索引

注意:

  • 我在...的标签列表中写了.loc[],但是您必须手动填写所有月份的整个slice表达式(pandas有一些daterange函数,但让我们保持简单) 。
  • pandas可以精确地以所需的strftime格式精确地显示DatetimeIndex的范围(然后您可以将其用作.iloc[]切片表达式)。

代码:

>>> pd.date_range(start='7/2019', end='6/2020', freq='M').strftime('%Y-%b')

Index(['2019-Jul', '2019-Aug', '2019-Sep', '2019-Oct', '2019-Nov', '2019-Dec',
       '2020-Jan', '2020-Feb', '2020-Mar', '2020-Apr', '2020-May'],
      dtype='object')