python - 组合多个数据框列
问题描述
我正在尝试将 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()
文件:月.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
文件:年.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()
使子集的索引dfM
从 0 开始,因此它可以正确对齐dfY
。suffixes=['_y', '_m']
保持列名不同。如果你愿意,你可以重命名这些。
推荐阅读
- command-line-interface - 交互模式没有以正确的方式接收选项
- php - 服务器上的安全 PHP 执行
- node.js - npm test 命令没有运行?
- java - 累加器在并行流中无法正常工作
- go - 如何在 Google Colaboratory 中运行 Go 二进制文件
- python-3.x - 以英语打印当前日期
- groovy - 在 jenkins pipline sh 步骤中使用 sed 转义引号
- c++ - 使用带括号表达式的逗号运算符示例
- c# - 使用 Apache 作为反向代理时,ASP.NET Core Razor 无法设置 cookie
- azure - 如何将放置在 azure 文件存储中的 .csv 文件的内容复制到 powershell 变量?