切片 Pandas Dataframe 时如何返回索引

Posted

技术标签:

【中文标题】切片 Pandas Dataframe 时如何返回索引【英文标题】:How to return the Index when slicing Pandas Dataframe 【发布时间】:2017-01-15 10:30:50 【问题描述】:
 df2=   pd.DataFrame(df1.iloc[:, [n for n in random.sample(range(1, 7), 3)]])

返回 df1 行和选定的列,但它返回通用索引 0,1,2,3..etc 返回我想要保留的 df1 的日期时间索引。我试过了:

df2=df1.copy(deep=True)

df2= pd.DataFrame(data=None, columns=df1.columns, index=df1.index)
df2= df1.iloc[:, [n for n in random.sample(range(1, 7), 3)]]

但它不起作用......

【问题讨论】:

【参考方案1】:

试试这个:

df2 = pd.DataFrame(df1.ix[:,random.sample(range(1,7),3)])

这将给出您想要的结果。

df1
Out[130]: 
   one  two
d  NaN  4.0
b  2.0  2.0
c  3.0  3.0
a  1.0  1.0

df1.ix[:,random.sample(range(0,2),2)]
Out[131]: 
   two  one
d  4.0  NaN
b  2.0  2.0
c  3.0  3.0
a  1.0  1.0

这将随机抽样您的列并在 df2 中返回它们。这将返回随机采样列的所有行,其索引与 df1 中一样。

编辑- 正如 MaxU 所建议的,您可以简单地使用:

df2 = df1.ix[:, random.sample(df.columns.tolist(), 3)].copy()

而不是调用 pd.DataFrame() 构造函数。

【讨论】:

嗨@Harshavardhan Ramanna 谢谢!但我不是在行上采样,而是在列上采样;我只选择一个随机的列子集,不一定是相邻的列,我想返回该列子集、它的行和日期时间格式的原始索引。但是,到目前为止,我返回了一个通用整数索引.. 谢谢.. 查看编辑后的答案。我认为这应该可行。 你不需要调用pd.DataFrame()构造函数,你可以这样做:df2 = df1.ix[:, random.sample(df.columns.tolist(), 3)].copy()【参考方案2】:

稍微不同的方法呢?

In [66]: df
Out[66]:
            c1  c2  c3
2016-01-01   4   0   3
2016-01-02   2   3   2
2016-01-03   1   2   3
2016-01-04   3   3   0
2016-01-05   1   0   4
2016-01-06   1   1   1
2016-01-07   2   3   3
2016-01-08   2   2   2
2016-01-09   4   0   0
2016-01-10   1   1   0
2016-01-11   1   3   0
2016-01-12   4   3   1
2016-01-13   0   0   3
2016-01-14   3   1   0
2016-01-15   4   3   1

In [67]: rnd = df.sample(n=6)

In [68]: rnd.index
Out[68]: DatetimeIndex(['2016-01-04', '2016-01-03', '2016-01-12', '2016-01-02', '2016-01-01', '2016-01-13'], dtype='datetime64[ns]', freq=None)

In [69]: rnd
Out[69]:
            c1  c2  c3
2016-01-04   3   3   0
2016-01-03   1   2   3
2016-01-12   4   3   1
2016-01-02   2   3   2
2016-01-01   4   0   3
2016-01-13   0   0   3

【讨论】:

您好,感谢您的快速回答!但是,这会返回索引的轨迹,但不会返回实际的日期时间字符串,即:索引的“2016-08-11”。这是我得到的回报: RangeIndex(start=0, stop=1305, step=1) 谢谢!但是.. 我得到这个 TypeError: cannot convert Int64Index->​​DatetimeIndex 我无法重现此错误 - 哪个步骤/命令会产生此异常?实际上像df.iloc[[5,0,4,3]].index 这样的东西也会返回DatetimeIndex... 我这样做了:df2 = (df1.iloc[:, [n for n in random.sample(range(1, 7), 4)]]) sample1=pd.DatetimeIndex(df2.索引)打印(样本1) @Pythus,你能解释一下你想要达到什么目标吗?

以上是关于切片 Pandas Dataframe 时如何返回索引的主要内容,如果未能解决你的问题,请参考以下文章

如何通过析取语句(逻辑“或”)对 pandas DataFrame 进行切片? [复制]

使用 ix() 方法对带有负索引的 pandas DataFrame 进行切片

带有迭代的 Pandas DataFrame 切片

将 Pandas DataFrame 切片成新的 DataFrame

按行切片 Pandas DataFrame

Pandas fillna()不适用于DataFrame切片[重复]