根据索引号从列表返回值

时间:2020-09-19 05:21:47

标签: python pandas

我一直在努力寻找熊猫解决方案,而无需循环:

输入:

df = pd.DataFrame({'A' : [[6,1,1,1], [1,5,1,1], [1,1,11,1], [1,1,1,20]]})

                A
0   [6, 1, 1, 1]
1   [1, 5, 1, 1]
2   [1, 1, 11, 1]
3   [1, 1, 1, 20]

输出:

                A   B
0   [6, 1, 1, 1]    6
1   [1, 5, 1, 1]    5
2   [1, 1, 11, 1]   11
3   [1, 1, 1, 20]   20

过去一个小时左右,我尝试了许多不同的事情,而且我知道解决方案将是一个令人尴尬的简单方法。感谢您的帮助-今天不是我的python天!

4 个答案:

答案 0 :(得分:5)

您可以进行简单的列表理解:

df['B'] = [s[i] for i, s in zip(df.index, df['A'])]

或者,如果您只想要对角线值:

df['B'] = np.diagonal([*df['A']])

               A   B
0   [6, 1, 1, 1]   6
1   [1, 5, 1, 1]   5
2  [1, 1, 11, 1]  11
3  [1, 1, 1, 20]  20

答案 1 :(得分:2)

使用numpy解决方案:

import pandas as pd 
import numpy as np

df = pd.DataFrame({'A' : [[6,1,1,1], [1,5,1,1], [1,1,11,1], [1,1,1,20]]})
df['B'] = pd.Series(np.diag(np.vstack(df['A'].to_numpy())), index=df.index)

df

答案 2 :(得分:2)

我也能够解决我自己的问题,但是非常糟糕。无论如何,我都会发布解决方案:

df = pd.DataFrame({'A' : [[6,1,1,1], [1,5,1,1], [1,1,11,1], [1,1,1,20]]})
s = df.explode('A')
i = s.groupby(level=0).cumcount()
df['B'] = s.loc[s.index == i, 'A']

               A   B
0   [6, 1, 1, 1]   6
1   [1, 5, 1, 1]   5
2  [1, 1, 11, 1]  11
3  [1, 1, 1, 20]  20

答案 3 :(得分:1)

您可以使用apply()和数据框索引(row.name)提取对角线元素。

import pandas as pd
df = pd.DataFrame({'A' : [[6,1,1,1], [1,5,1,1], [1,1,11,1], [1,1,1,20]]})

df['B']=df.apply(lambda row: row['A'][row.name],axis=1)

print(df)

输出:

    A              B
0   [6, 1, 1, 1]   6
1   [1, 5, 1, 1]   5
2  [1, 1, 11, 1]  11
3  [1, 1, 1, 20]  20