2017-09-14 71 views
1

查找数据帧中的每个列的最后一个位置,我已经做了一些搜索来回答这个问题,但我无法弄清楚如何做到这一点:由熊猫

我有一个包含185行的数据集和30列。并非所有的行都有价值。我想查找每列的最后一个值的位置并获取该列的索引。我不知道如何做到这一点的操作,当我用下面的代码它给我的数据帧的长度不只是列:

len(data_exam['col']) 

我将不胜感激任何建议。

另外我想确保如果我想要读取循环中的所有列,我的下面的代码是不是一个好的选择! :

list=[] 
for col in data: 
    function which find the length of column 

谢谢。

+0

你能否解释一下 “不是所有的行具有价值。”这是否意味着您寻找的价值之后,所有东西都是空白的?也请张贴样本/可复制的数据。 –

+0

所以,要清楚的是,如果你有10列,第一行只有前5列的值,你会想要第五列的索引? –

回答

2

可以使用last_valid_index找到给定列中最后一个有效值的索引位置。还有一对双人间,first_valid_index

# Set-up sample data. 
np.random.seed(0) 
df = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC')) 

df.iloc[2:, 0] = np.nan 
df.iloc[4:, 1] = np.nan 
>>> df 
      A   B   C 
0 1.764052 0.400157 0.978738 
1 2.240893 1.867558 -0.977278 
2  NaN -0.151357 -0.103219 
3  NaN 0.144044 1.454274 
4  NaN  NaN 0.443863 

# Solution to find index of last valid values per column. 
>>> df.apply(lambda series: series.last_valid_index()) 
A 1 # <== Index of last valid data in column A. 
B 3 # <== Index of last valid data in column B. 
C 4 # <== Index of last valid data in column C. 
dtype: int64 
2

IIUC,你想在每列中的最后一个非楠的价值:

df[::-1].bfill().iloc[0] 

例子:

df = pd.DataFrame({'A':[1,2,3,4,np.nan],'B':[1,np.nan,np.nan,np.nan,np.nan],'C':[1,2,3,4,5]}) 

    A B C 
0 1.0 1.0 1 
1 2.0 NaN 2 
2 3.0 NaN 3 
3 4.0 NaN 4 
4 NaN NaN 5 

输出:

A 4.0 
B 1.0 
C 5.0 
Name: 4, dtype: float64 
+0

OP要求查找最后一个值的索引。 _“我想查找每列上的最后一个值的位置并获取该列的索引。”_应该可以读取“该值的索引”。 – Alexander

2
df.reset_index().melt('index').dropna().groupby('variable')['index'].max() 
Out[487]: 
variable 
A 3 
B 0 
C 4 
Name: index, dtype: int64 
+1

您应该使用'last()'而不是'max()'来泛化其他索引(例如,如果索引被逆转,这将失败)。另外,使用“熔体”会显着降低性能。 – Alexander

+0

@Alexander是的你是对的;-) – Wen