[英]Combining multiple data-frame columns
我正在嘗試將2個數據幀列合並為1,但是當我嘗試根據特定大小進行操作時,第二個數據幀列無法正確復制。
我已經嘗試了下面粘貼下面的代碼。
import pandas as pd
def readDataFile():
fileName = "year.csv"
dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
dfY = pd.read_csv(fileName, parse_dates=['date'], date_parser=dateparse)
fileName = "month.csv"
dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
dfM = pd.read_csv(fileName, parse_dates=['date'], date_parser=dateparse)
newDF = pd.DataFrame()
newDF['date_y'] = dfY['date']
newDF['year_y_n'] = dfY['Y_N']
newDF['date_m'] = dfM['date'][len(dfM) - len(dfY):len(dfM)]
newDF['year_y_n'] = dfM['Y_N'][len(dfM) - len(dfY):len(dfM)]
print newDF
readDataFile()
檔案:month.csv
date,Y_N
2018-03-14 04:00:00,N
2018-04-03 04:00:00,N
2018-05-31 04:00:00,Y
2018-06-14 04:00:00,N
2018-07-30 04:00:00,N
2018-08-31 04:00:00,Y
2018-09-28 04:00:00,N
2018-10-10 04:00:00,N
2018-11-07 04:00:00,Y
2018-12-31 04:00:00,N
2019-01-31 04:00:00,N
2019-02-05 04:00:00,Y
2019-03-29 04:00:00,N
2019-04-30 04:00:00,Y
2019-05-03 04:00:00,N
2019-06-03 04:00:00,Y
文件:year.csv
date,Y_N
2014-05-23 04:00:00,Y
2015-12-21 04:00:00,N
2016-05-03 04:00:00,Y
2017-12-20 04:00:00,N
2018-06-14 04:00:00,N
2019-06-25 04:00:00,N
這些是當前結果:
date_y year_y_n date_m month_y_n
0 2014-05-23 04:00:00 Y NaT NaN
1 2015-12-21 04:00:00 N NaT NaN
2 2016-05-03 04:00:00 Y NaT NaN
3 2017-12-20 04:00:00 N NaT NaN
4 2018-06-14 04:00:00 N NaT NaN
5 2019-06-25 04:00:00 N NaT NaN
預期結果是:
date_y year_y_n date_m month_y_n
2014-05-23 04:00:00 Y 2019-01-31 04:00:00 N
2015-12-21 04:00:00 N 2019-02-05 04:00:00 Y
2016-05-03 04:00:00 Y 2019-03-29 04:00:00 N
2017-12-20 04:00:00 N 2019-04-30 04:00:00 Y
2018-06-14 04:00:00 N 2019-05-03 04:00:00 N
2019-06-25 04:00:00 N 2019-06-03 04:00:00 Y
假設您有任意數量的數據幀dfA
, dfB
, dfC
等。您想合並它們,但是它們的大小不同。 最基本的方法是將它們串聯起來:
df = pd.concat([dfA, dfB, dfC], axis=1)
但是,如果數據幀的大小不同,則會缺少行。 如果您不在乎保留哪些行,則可以刪除缺少值的行:
df.dropna()
但是,如果您特別想使用每個數據幀的最后N行,其中N是最小數據幀的長度,則需要做更多的工作。 但是,我將等待,看看這是否是您想要的。
舊答案:
合並可能比這簡單得多。 使用pd.merge
:
pd.merge(dfY, dfM[-len(dfY):].reset_index(),
suffixes=['_y', '_m'], left_index=True, right_index=True)
dfM[-len(dfY):]
得到的最后N行dfM
,其中N是長度dfY
。 .reset_index()
使.reset_index()
的子集的dfM
從0開始,因此它可以與dfY
正確對齊。 suffixes=['_y', '_m']
使列名保持不同。 您可以根據需要重命名這些名稱。 問題與索引有關。 如果您運行下面的代碼:
newDF = pd.DataFrame()
newDF['date_y'] = dfY['date']
print(newDF)
您將獲得輸出:
date_y
0 2014-05-23 04:00:00
1 2015-12-21 04:00:00
2 2016-05-03 04:00:00
3 2017-12-20 04:00:00
4 2018-06-14 04:00:00
5 2019-06-25 04:00:00
索引從0開始
並運行此:
newDF = pd.DataFrame()
newDF['date_m'] = dfM['date'][len(dfM) - len(dfY):len(dfM)]
print(newDF)
您將獲得輸出:
date_m
10 2019-01-31 04:00:00
11 2019-02-05 04:00:00
12 2019-03-29 04:00:00
13 2019-04-30 04:00:00
14 2019-05-03 04:00:00
15 2019-06-03 04:00:00
在這里,索引從10開始
因此,您需要重置dfM數據幀的“日期”和“ Y_N”列的索引,如下所示:
def readDataFile():
fileName = "year.csv"
dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
dfY = pd.read_csv(fileName, parse_dates=['date'], date_parser=dateparse)
fileName = "month.csv"
dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
dfM = pd.read_csv(fileName, parse_dates=['date'], date_parser=dateparse)
newDF = pd.DataFrame()
newDF['date_y'] = dfY['date']
newDF['year_y_n'] = dfY['Y_N']
# Changes made on this line.
newDF['date_m'] = dfM['date'][len(dfM) - len(dfY):len(dfM)].reset_index(drop=True)
newDF['month_y_n'] = dfM['Y_N'][len(dfM) - len(dfY):len(dfM)].reset_index(drop=True)
print(newDF)
readDataFile()
輸出:
date_y year_y_n date_m month_y_n
0 2014-05-23 04:00:00 Y 2019-01-31 04:00:00 N
1 2015-12-21 04:00:00 N 2019-02-05 04:00:00 Y
2 2016-05-03 04:00:00 Y 2019-03-29 04:00:00 N
3 2017-12-20 04:00:00 N 2019-04-30 04:00:00 Y
4 2018-06-14 04:00:00 N 2019-05-03 04:00:00 N
5 2019-06-25 04:00:00 N 2019-06-03 04:00:00 Y
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.