reset_index and .apply on ex index



我永远不会学熊猫。

有人能帮我理解下面片段中标记为1和2的行之间的区别吗?

import pandas as pd
from posixpath import join
values = [["file1", [1,2,3]], ["file2", [5,2]]]
df = pd.DataFrame(data=values, columns=["fn", "feat"]).set_index("fn")
# 1
df["path"] = df.reset_index()["fn"].apply(lambda x: join("fld", x))
display(df)
# 2
df = df.reset_index()
df["path2"] = df["fn"].apply(lambda x: join("fld", x))
display(df)

其输出为:

feat path
fn                   
file1  [1, 2, 3]  NaN
file2     [5, 2]  NaN
fn       feat path      path2
0  file1  [1, 2, 3]  NaN  fld/file1
1  file2     [5, 2]  NaN  fld/file2

第一个apply返回NaN,第二个返回我对第一个apply的期望。

检查reset_index:前后的索引

#index values are created by fn columns
print (df)
feat
fn              
file1  [1, 2, 3]
file2     [5, 2]
#index values are strings
print (df.index)
Index(['file1', 'file2'], dtype='object', name='fn')
#created default index
print (df.reset_index())
fn       feat
0  file1  [1, 2, 3]
1  file2     [5, 2]
#index values are range
print (df.reset_index().index)
RangeIndex(start=0, stop=2, step=1)

因为有不同的索引值创建了NaNs,因为reset_index没有修改df["path"] = df.reset_index()["fn"]中的原始df.index,所以df.indexdf.reset_index().index中的索引不同:

df["path"] = df.reset_index()["fn"]
print (df)
feat path
fn                   
file1  [1, 2, 3]  NaN
file2     [5, 2]  NaN

但如果分配回reset_index会得到默认的索引值,所以如果分配回解决方案有效,因为两边的索引相同:

df = df.reset_index()
print (df)
fn       feat
0  file1  [1, 2, 3]
1  file2     [5, 2]
print (df.index)
RangeIndex(start=0, stop=2, step=1)

最新更新