从特定列的每一行数组中提取某些元素

时间:2020-05-31 17:49:10

标签: python

我正在尝试从具有指定索引的特定列的数组行中提取值。

一个虚拟的例子,如果我在数据框中有一个名为“ arr”的列,其中下面的每个数组都是一行-

[1, 2, 3, 4, 5]

[6, 7, 8, 9, 10]

[11, 12, 13, 14, 15]

[16, 17, 18, 19, 20]

我尝试过:

for row in df.itertuples(): 
    i1 = [0,1,2]
    r1 = np.array(df.arr)[i1]

    i2 = [2,3]
    r2 = np.array(df.arr)[i2]

给出数据帧的行0、1和2。

我已经尝试过:

for row in df.itertuples(): 
    i1 = [0,1,2]
    r1 = np.array(row.arr)[i1]

    i2 = [2,3]
    r2 = np.array(row.arr)[i2]

仅给出最后一行的值。我不明白为什么。

我要获取的是i1和i2中指定的索引,作为每行的两个不同变量(r1和r2)。如此

r1应该给出-

[1, 2, 3]

[6, 7, 8]

[11, 12, 13]

[16, 17, 18]

r2应该给出-

[3, 4]

[8, 9]

[13, 14]

[18, 19]

我也没有运气使用过iterrows()。

2 个答案:

答案 0 :(得分:1)

如果要将列r1和r2放在同一数据框中,则可以使用:

df = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
df['arr'] = df[['b', 'c', 'd', 'e']].values.tolist()
df['r1']=df['arr']
df['r1']=df['r1'].apply(lambda x:x[0:3])
df['r2']=df['arr']
df['r2']=df['r2'].apply(lambda x:x[2:4])

我已经应用了lambda来工作,这是您想要的吗?

如果要使用第r1和r2行的新数据框,则可以使用

from operator import itemgetter 
a=[0,1,2]
b=[2,3]
df = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
df['arr'] = df[['b', 'c', 'd', 'e']].values.tolist()
data=pd.DataFrame()
data['r1']=df['arr']
data['r2']=df['arr']
data['r1']=data['r1'].apply(lambda x:itemgetter(*a)(x))
data['r2']=data['r2'].apply(lambda x:itemgetter(*b)(x))
data  

此编辑对您有帮助吗!

答案 1 :(得分:1)

尝试:

i1, i2 = [0,1,2],[2,3]
number_rows = 4
r1, r2 = np.zeros((number_rows,3)), np.zeros((number_rows,2))
for i in range(number_rows):
    r1[i] = np.array(df.arr)[i][i1]
    r2[i] = np.array(df.arr)[i][i2]

第一次尝试的问题是,如果仅给2D(如np.array(df.arr))数组提供一个索引,它将为每个索引返回整行。

在第二次尝试中,您实际上获得了每一行想要的结果,但是您覆盖了前几行的结果,因此只获得了最后一行的值。 您可以通过将每行的结果插入结果数组中来解决此问题,如上所述。

相关问题