【问题标题】:How do you copy monthly columns from one dataframe to another您如何将每月列从一个数据框复制到另一个数据框
【发布时间】:2020-10-18 02:36:01
【问题描述】:

我想创建一个数据框,将当年的月份加上前一年的月份加到 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]

【问题讨论】:

  • 请提供minimal reproducible example我想创建一个数据框,将当年的月份加上前一年的月份加到 12 个月。 你能扩展一下吗?我不确定我是否理解您要执行的操作。
  • Ex - 我想要来自去年数据的数据框中的最后 6 个月数据(7 月至 12 月)和今年数据框(1 月至 6 月)中的第一个 6 个月数据。我想将该数据放入一个新的数据框中。我需要逐行(与 enmass)抓取数据以删除垃圾行。
  • @kalmdown 您可以从 2019 df 和 2020 df 中选择所需的列,然后删除每个 dfs 中的垃圾行,然后连接这两个数据帧。或者在加入 2019 df 和 2020 df 的选定列后删除垃圾行。
  • 您的每月数据实际上是在中,而不是在行中。所以你真的想对 columns Jan-Jun 2020 进行切片并将它们按列连接pd.concat(..., axis=1) 它到 Jul-Dec 2019。
  • @kalmdown 那仍然不是minimal reproducible example。另外,请以更方便的格式分享数据。

标签: python pandas


【解决方案1】:

您的每月数据实际上是在中,而不是在行中。所以你真的想分割 columns Jan-Jun 2020 并将它们按列连接 pd.concat(..., axis=1) 到 Jul-Dec 2019 的列。

  • 否则,由于通常 pandas(和大多数数据科学工具)对行而不是列进行操作要容易得多,如果您 转置 em> 你的数据框在你读入它们时立即:pd.read_excel(...).T。那是.T 或等效的.transpose() 函数。现在每个月的数据都在中。

  • 事实上,当你读入它们时,你也可以连接你的两个数据框:

    df_all90 = pd.concat([pd.read_excel('&lt;2019.xls&gt;'), pd.read_excel('&lt;2020.xls&gt;')], axis=1).T

  • 现在剩下的就是分割您感兴趣的行:

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

注意:

  • 我在.loc[] 的标签列表中写了...,但您必须手动填写整个切片表达式以及所有月份(pandas 有一些日期范围函数,但我们保持简单)。
  • 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')

【讨论】:

  • 另一种非常不同的方法。我可能不得不尝试这两种方法作为学习经验。谢谢。
  • kalmdowm: 当然,试一试,如果有什么需要更好的解释,请告诉我
  • 问题最终是 Excel 电子表格有两组数据。一个集合,在第一个 12 列中,一个集合在接下来的 12 列中,但每个集合使用不同的行。我想我可以分别提取每一列并将其转置到它自己的数据框中。可能会先寻找其他解决方案,但请记住这一点。
  • kalmdown:所以只需将pd.read_excel() 两个文件分开,修复它们的行/列,然后pd.concat([...]) 它们,就像我在这里展示的那样。这是您的解决方案。
【解决方案2】:

您可以从 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]

【讨论】:

  • 嗯……没想到。我会试一试,看看我能不能做到。
猜你喜欢
  • 2019-09-28
  • 1970-01-01
  • 2018-08-03
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多