我正在尝试从具有指定索引的特定列的数组行中提取值。
一个虚拟的例子,如果我在数据框中有一个名为“ 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()。
答案 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)
)数组提供一个索引,它将为每个索引返回整行。
在第二次尝试中,您实际上获得了每一行想要的结果,但是您覆盖了前几行的结果,因此只获得了最后一行的值。 您可以通过将每行的结果插入结果数组中来解决此问题,如上所述。