我想创建一个数据帧,该数据帧使用当年的月份加上上一年的月份,得出12。另外,由于要删除行,因此逐行检查并删除垃圾行。
两个Excel工作表已导入到数据框:
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
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]
答案 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函数,但让我们保持简单) 。.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')
pd.DatetimeIndex
actually supports an indexer_between_time(self, start_time, end_time...)
比较运算符,但显然仅适用于时间,不适用于日期或日期时间。因此,可以在开始日期到结束日期之间分割df。