【发布时间】:2019-07-26 01:26:51
【问题描述】:
以下问题是对此的简化:Iterating through lists within a pandas DataFrame
我有一个包含一列列表的 DataFrame:
import numpy as np
import pandas as pd
col = [["A", "B", "C", "D"], ["E", "F"]]
d = {"col" : [["A", "B", "C", "D"], ["E", "F"]]}
df = pd.DataFrame(d)
print(df)
Out[2]:
col
0 [A, B, C, D]
1 [E, F]
对于每一行,我想遍历列表并在以下情况之间进行选择:
- 列表的第一项(列表索引 = 0):将列表的第一项写入第一列
- 第一个和最后一个条目之间的条目(列表索引 = i):根据当前迭代将当前条目和该条目之前的条目写入列中
- 列表的最后一个条目(列表索引 = -1):根据当前迭代将当前条目和之前的条目写入列中,并根据当前迭代将列表的最后一个条目写入列中+ 1
- 如果列表索引 i 大于列表的长度:根据当前迭代将 np.nan 写入列中
生成的 DataFrame 应如下所示:
col 0 1 2 3 4 5
0 [A, B, C, D] A B-A C-B D-C D np.nan
1 [E, F] E F-E F np.nan np.nan np.nan
为了得到这个结果,我尝试了一个嵌套的 numpy.where 函数:
for i in range(7):
df[i] = pd.DataFrame(np.where(i == 0,
df["col"].apply(lambda x: x[0]),
np.where(i == df["col"].apply(len),
df["col"].apply(lambda x: x[-1]),
np.where((i > 0) & (i <= df["col"].apply(len) - 1),
df["col"].apply(lambda x: x[i]) + '-' + df["col"].apply(lambda x: x[i-1]),
np.nan
)
)
)
)
print(df)
这是我的问题:我收到了IndexError: list index out of range
我想这与i 有关。
即使我捕捉到i 的无效大小写,整个嵌套 where 术语无效。 (我也用numpy.select 尝试过,但得到了相同的结果。)
如果我用1 替换索引i 它可以工作(当然它会给我错误的值,但我没有收到错误),所以它必须与这个索引有关,但我不知道如何解决这个问题:
for i in range(7):
df[i] = pd.DataFrame(np.where(i == 0,
df["col"].apply(lambda x: x[0]),
np.where(i == df["col"].apply(len),
df["col"].apply(lambda x: x[-1]),
np.where((i > 0) & (i <= df["col"].apply(len) - 1),
df["col"].apply(lambda x: x[1]) + '-' + df["col"].apply(lambda x: x[1-1]),
np.nan
)
)
)
)
print(df)
col 0 1 2 3 4 5
0 [A, B, C, D] A B-A B-A B-A D np.nan
1 [E, F] E F-E F np.nan np.nan np.nan
您能想出一个解决方案或另一种方法来获得我想要的 DataFrame 吗?
【问题讨论】: