【问题标题】:Pandas Split Dataframe into two Dataframes at a specific rowPandas 在特定行将数据框拆分为两个数据框
【发布时间】:2017-05-28 05:07:17
【问题描述】:

我有pandas DataFrame,它是由concat 组成的。一行包含 96 个值,我想将 DataFrame 从值 72 中拆分出来。

这样一行的前 72 个值存储在 Dataframe1 中,接下来的 24 个值存储在 Dataframe2 中。

我按如下方式创建我的 DF:

temps = DataFrame(myData)
datasX = concat(
[temps.shift(72), temps.shift(71), temps.shift(70), temps.shift(69), temps.shift(68), temps.shift(67),
 temps.shift(66), temps.shift(65), temps.shift(64), temps.shift(63), temps.shift(62), temps.shift(61),
 temps.shift(60), temps.shift(59), temps.shift(58), temps.shift(57), temps.shift(56), temps.shift(55),
 temps.shift(54), temps.shift(53), temps.shift(52), temps.shift(51), temps.shift(50), temps.shift(49),
 temps.shift(48), temps.shift(47), temps.shift(46), temps.shift(45), temps.shift(44), temps.shift(43),
 temps.shift(42), temps.shift(41), temps.shift(40), temps.shift(39), temps.shift(38), temps.shift(37),
 temps.shift(36), temps.shift(35), temps.shift(34), temps.shift(33), temps.shift(32), temps.shift(31),
 temps.shift(30), temps.shift(29), temps.shift(28), temps.shift(27), temps.shift(26), temps.shift(25),
 temps.shift(24), temps.shift(23), temps.shift(22), temps.shift(21), temps.shift(20), temps.shift(19),
 temps.shift(18), temps.shift(17), temps.shift(16), temps.shift(15), temps.shift(14), temps.shift(13),
 temps.shift(12), temps.shift(11), temps.shift(10), temps.shift(9), temps.shift(8), temps.shift(7),
 temps.shift(6), temps.shift(5), temps.shift(4), temps.shift(3), temps.shift(2), temps.shift(1), temps,
 temps.shift(-1), temps.shift(-2), temps.shift(-3), temps.shift(-4), temps.shift(-5), temps.shift(-6),
 temps.shift(-7), temps.shift(-8), temps.shift(-9), temps.shift(-10), temps.shift(-11), temps.shift(-12),
 temps.shift(-13), temps.shift(-14), temps.shift(-15), temps.shift(-16), temps.shift(-17), temps.shift(-18),
 temps.shift(-19), temps.shift(-20), temps.shift(-21), temps.shift(-22), temps.shift(-23)], axis=1)

问题是:如何拆分它们? :)

【问题讨论】:

  • 自动生成N个datafames?
  • 请编辑问题以指定您要沿列垂直拆分,而不是沿行水平拆分。

标签: python pandas numpy dataframe


【解决方案1】:

iloc

df1 = datasX.iloc[:, :72]
df2 = datasX.iloc[:, 72:]

(iloc docs)

【讨论】:

  • @piRSquared,如果我必须选择行,我可以使用df1 = datasX[0:10]df2 = datasX[10:] 吗?那么,这将为 df1 提供 10 行而 df2 与其余的?
  • @i.n.n.m 是的。但是,我个人不喜欢使用这种类型的切片,因为它令人困惑。我使用df[['col1', 'col2]] 对列进行切片。仅仅因为 pandas 将 0:10 推断为索引位置,并不能证明使用该语法是合理的……对我来说。这完全是我的意见,你可以做你需要做的。但我会使用df.iloc[:10]df.iloc[10:]
  • @piRSquared 我同意选择列会很好地使用您提到的方式。我的问题是关于行的。这也适用于选择行吗?
  • @i.n.n.m 只提到了列以突出显示您询问datasX[0:10] 是否可以对行进行切片。事实证明它会,但是这种语法看起来太像列切片了。你的建议会很好用。但我会使用iloc 使其更加明显。所以,我会使用df.iloc[:10] 而不是df[:10]
  • 是的,你做的一切都是对的。我误解了这个问题。这个问题应该改写为“如何在第 72 列拆分数据框?”
【解决方案2】:

使用np.split(..., axis=1):

演示:

In [255]: df = pd.DataFrame(np.random.rand(5, 6), columns=list('abcdef'))

In [256]: df
Out[256]:
          a         b         c         d         e         f
0  0.823638  0.767999  0.460358  0.034578  0.592420  0.776803
1  0.344320  0.754412  0.274944  0.545039  0.031752  0.784564
2  0.238826  0.610893  0.861127  0.189441  0.294646  0.557034
3  0.478562  0.571750  0.116209  0.534039  0.869545  0.855520
4  0.130601  0.678583  0.157052  0.899672  0.093976  0.268974

In [257]: dfs = np.split(df, [4], axis=1)

In [258]: dfs[0]
Out[258]:
          a         b         c         d
0  0.823638  0.767999  0.460358  0.034578
1  0.344320  0.754412  0.274944  0.545039
2  0.238826  0.610893  0.861127  0.189441
3  0.478562  0.571750  0.116209  0.534039
4  0.130601  0.678583  0.157052  0.899672

In [259]: dfs[1]
Out[259]:
          e         f
0  0.592420  0.776803
1  0.031752  0.784564
2  0.294646  0.557034
3  0.869545  0.855520
4  0.093976  0.268974

np.split() 非常灵活 - 让我们在索引为 [2,3] 的列处将原始 DF 拆分为 3 个 DF:

In [260]: dfs = np.split(df, [2,3], axis=1)

In [261]: dfs[0]
Out[261]:
          a         b
0  0.823638  0.767999
1  0.344320  0.754412
2  0.238826  0.610893
3  0.478562  0.571750
4  0.130601  0.678583

In [262]: dfs[1]
Out[262]:
          c
0  0.460358
1  0.274944
2  0.861127
3  0.116209
4  0.157052

In [263]: dfs[2]
Out[263]:
          d         e         f
0  0.034578  0.592420  0.776803
1  0.545039  0.031752  0.784564
2  0.189441  0.294646  0.557034
3  0.534039  0.869545  0.855520
4  0.899672  0.093976  0.268974

【讨论】:

  • 感谢您的帮助,我现在有 iloc,它也可以正常工作,但对于未来来说,很高兴知道! :)
【解决方案3】:

我通常使用数组拆分,因为它的语法更简单,并且在超过 2 个分区时可以更好地扩展。

import numpy as np
partitions = 2
dfs = np.array_split(df, partitions)

np.split(df, [100,200,300], axis=0] 想要明确的索引号,可能需要也可能不需要。

【讨论】:

    猜你喜欢
    • 2015-05-14
    • 2016-06-24
    • 2020-10-24
    • 2022-12-03
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    相关资源
    最近更新 更多