2

作为尝试学习熊猫的一部分,我正在尝试重塑电子表格。删除非零值后,我需要从单列中获取一些数据。

对于下面的示例列,我想找到最有效的方法来查找cell包含该值的行和列索引date并获取它旁边的值。(例如这里是38477.

实际上,这将是一个更大的 DataFrame,并且date行可能会发生变化,并且它可能并不总是在第一列中。

找出date数组中的位置并返回相邻单元格中的值的最佳方法是什么?

谢谢

<bound method DataFrame.head of             0         1         2         4         5         7         8         10  \
1   some title                                                                         
2         date     38477                                                               
5                   cat1                cat2                cat3                cat4   
6                      a         b         c         d         e         f         g   
8            Z  167.9404  151.1389   346.197  434.3589  336.7873  80.52901  269.1486   
9            X   220.683   56.0029  73.73679  428.8939  483.7445  251.1877  243.7918   
10           C  433.0189  390.1931  251.6636  418.6703  12.21859   113.093    136.28   
12           V  226.0135  418.1141  310.2038  153.9018  425.7491  73.08073  277.5065   
13           W   295.146  173.2747  2.187459  401.6453  51.47293   175.387  397.2021   
14           S  306.9325  157.2772  464.1394   216.248  478.3903   173.948  328.9304   
15           A  19.86611  73.11554   320.078  199.7598  467.8272  234.0331  141.5544   
4

1 回答 1

3

这实际上只是重新格式化了您正在执行的许多迭代,以使其更清晰,并利用 pandas 轻松选择的能力等。

首先,我们需要一个虚拟数据框(日期在最后一行,并按照您在设置中的方式明确排序)

import pandas as pd
df = pd.DataFrame({"A": [1,2,3,4,np.NaN], 
                   "B":[5, 3, np.NaN, 3, "date"],
                   "C":[np.NaN,2, 1,3, 634]})[["A","B","C"]]

一个明确的方法是找到该行,然后枚举该行以查找date

row = df[df.apply(lambda x: (x == "date").any(), axis=1)].values[0] # will be an array
for i, val in enumerate(row):
    if val == "date":
        print row[i + 1]
        break

如果您的电子表格只有几个非数字列,您可以按列检查日期并获取行和列索引(这可能会更快,因为它按列而不是按行搜索,尽管我不确定)

# gives you column labels, which are `True` if at least one entry has `date` in it
# have to check `kind` otherwise you get an error.
col_result = df.apply(lambda x: x.dtype.kind == "O" and (x == "date").any())

# select only columns where True (this should be one entry) and get their index (for the label)
column = col_result[col_result].index[0]
col_index = df.columns.get_loc(column)

# will be True if it contains date
row_selector = df.icol(col_index) == "date"

print df[row_selector].icol(col_index + 1).values
于 2013-05-26T03:38:34.270 回答