切片 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 进行切片