【问题标题】:Why am I not getting a proper index on pulling df.index?为什么我在拉动 df.index 时没有得到正确的索引?
【发布时间】:2019-04-13 12:51:52
【问题描述】:

我得到了一种迭代,而不是索引值。

我有一个数据框。 我对该数据框进行切片。 然后我将该数据帧转换为 numpy 数组,以便从切片中提取唯一值。 然后我将 numpy 数组转换回数据框。 然后我运行一个 for 循环来提取与唯一值相对应的原始数据帧切片的值的索引。 我的行为很奇怪。

df = pd.read_excel('Book2.xlsm')
v =  (df.loc[:, 'test'].values)
g = np.unique(v, return_index=True)
v2 = pd.DataFrame(g)

for v2 in df.loc[:, 'test']:
    print (df.index)

我所说的奇怪行为:

RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)

我得到上面的 14465 行。但没有索引值

示例数据帧


test   age
0      17 - Alpha OH PROGESTERONE - HORMONE ASSAYS  23.0
1      17 - Alpha OH PROGESTERONE - HORMONE ASSAYS  26.0
2                    17 ALPHA HYDROXY PROGESTERONE  18.0
3                    17 ALPHA HYDROXY PROGESTERONE  18.0
4                    17 ALPHA HYDROXY PROGESTERONE  21.0
5                    17 ALPHA HYDROXY PROGESTERONE  25.0
6                    17 ALPHA HYDROXY PROGESTERONE  27.0
7                      24 hrs URINE FOR CREATININE  32.0
8                      24 hrs URINE FOR CREATININE  43.0
9                      24 hrs URINE FOR CREATININE  52.0
10                     24 hrs URINE FOR CREATININE  53.0
11                     24 hrs URINE FOR CREATININE  56.0
12                     24 hrs URINE FOR CREATININE  57.0
13                     24 hrs URINE FOR CREATININE  57.0
14                     24 hrs URINE FOR CREATININE  57.0
15                     24 hrs URINE FOR CREATININE  58.0
16                     24 hrs URINE FOR CREATININE  62.0
17                     24 hrs URINE FOR CREATININE  85.0
18                        24 hrs URINE FOR PROTEIN   3.0
19                        24 hrs URINE FOR PROTEIN   5.0
20                        24 hrs URINE FOR PROTEIN   5.0
21                        24 hrs URINE FOR PROTEIN  16.0
22                        24 hrs URINE FOR PROTEIN  25.0
23                        24 hrs URINE FOR PROTEIN  27.0
24                        24 hrs URINE FOR PROTEIN  28.0
25                        24 hrs URINE FOR PROTEIN  32.0
26                        24 hrs URINE FOR PROTEIN  32.0
27                        24 hrs URINE FOR PROTEIN  32.0
28                        24 hrs URINE FOR PROTEIN  33.0
29                        24 hrs URINE FOR PROTEIN  34.0

输出应该是这样的:

[0:1]
[2:6]
[7:17]
[18:29]

【问题讨论】:

  • 请发布一个示例数据框,我们可以复制粘贴来复制它,也发布预期的输出只是为了清楚。谢谢
  • 你想要什么?每个组的第一个索引与最后一个索引?
  • 是的。没错!

标签: python python-3.x pandas numpy dataframe


【解决方案1】:

注意:现在针对 OP 问题陈述的新变体发布了更准确的解决方案。我将保持这个解决方案作为未来的另一个参考。


如果您只想提取唯一性的第一个索引,也许您想尝试 drop_duplicates 代替?

import pandas as pd
data = {'x': ['does', 'this', 'index', 'solve', 'anything', 'your', 'what', 'issue?'], 
        'y': ['a', 'b', 'b', 'c', 'a', 'd', 'd', 'e']}

df = pd.DataFrame(data).set_index('x')
print (df)

这给出了:

现在获取唯一y的索引,

unique = df.drop_duplicates(subset=['y'], keep='first')
unique.index

给予:

Index(['does', 'this', 'solve', 'your', 'issue?'], dtype='object', name='x')

​ 希望这会有所帮助。

【讨论】:

    【解决方案2】:

    IIUC,使用:

    df.drop_duplicates('test').combine_first(df.drop_duplicates('test',keep='last'))
    

                                            test   age
    0  17 - Alpha OH PROGESTERONE - HORMONE ASSAYS  23.0
    1  17 - Alpha OH PROGESTERONE - HORMONE ASSAYS  26.0
    2                17 ALPHA HYDROXY PROGESTERONE  18.0
    6                17 ALPHA HYDROXY PROGESTERONE  27.0
    ......................
    .....................
    

    groupby() 的另一种可能解决方案:

    df.groupby('test')['test'].apply(lambda x:[ x.index[0],x.index[-1]])
    

    test
    17 - Alpha OH PROGESTERONE - HORMONE ASSAYS      [0, 1]
    17 ALPHA HYDROXY PROGESTERONE                    [2, 6]
    24 hrs URINE FOR CREATININE                     [7, 17]
    24 hrs URINE FOR PROTEIN                       [18, 29]
    

    【讨论】:

    • 在定义一系列索引之前执行 sort_values() 会是更好的方法,假设 OP 需要一系列索引。
    • @YashNag groupby 将在假设索引已排序的情况下处理该问题。怎么说?
    • @anki_91 是的,我完全忽略了它。它确实会照顾它。感谢您的澄清。
    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多