繁体   English   中英

索引到 pandas DataFrame 的数组列

[英]Indexing into array columns of a pandas DataFrame

我有一个包含一些数组列的 pandas DataFrame。 通过不同的 position 索引来索引其中一些列的推荐方法是什么? 例如,从名为l的数组列中我需要第二个元素,从名为a的数组列中我需要第一个元素。 结果应该是新的 DataFrame。 数组列可以包含 Python 列表或 Numpy 数组,但这可能无关紧要。

我有三个解决方案,但我真的不喜欢其中任何一个。

df= pd.DataFrame({'l': [[1, 2, 4], [3, 2, 0, 10]], \
                  'a':[np.array(["foo", "bar", "baz"]), np.array(["qux", "quux"])], \
                  'dontcare': [10, 20]})
               l                a  dontcare
0      [1, 2, 4]  [foo, bar, baz]        10
1  [3, 2, 0, 10]      [qux, quux]        20

解决方案 1,使用strjoin

df['l'].str[1].to_frame('l').join(df['a'].str[0])
   l    a
0  2  foo
1  2  qux

解决方案2,用function apply并创建系列

df.apply(lambda row: pd.Series([row['l'][1], row['a'][0]], index=['l', 'a']), axis=1)

解决方案 3,使用applybroadcast

df[['l', 'a']].apply(lambda row: [row['l'][1], row['a'][0]], axis=1, result_type='broadcast')

我们可以假设 output 列名与输入列名匹配,并且我们不需要任何数组列的多个元素。

我认为这取决于。

第一个解决方案是最通用的,如果索引不存在,则始终工作 - 然后返回NaN 但如果大DataFrame也是最慢解决方案的原因。

print (df['l'].str[3].to_frame('l').join(df['a'].str[2]))
      l    a
0   NaN  baz
1  10.0  NaN

apply的另一个解决方案应该更快,但如果值不存在,则会失败。

print (df.apply(lambda row: pd.Series([row['l'][3], row['a'][2]], index=['l', 'a']), axis=1))

IndexError: ('list index out of range', '发生在索引 0')


如果列表中始终存在值的另一个想法是使用列表理解(但失败类似于应用,如果不存在)与*ctail

df= pd.DataFrame({'l': [[1, 2, 4], [3, 2, 0, 10]], \
                  'a':[np.array(["foo", "bar", "baz"]), np.array(["qux", "quux"])], \
                  'dontcare': [10, 20],
                   's': [10, 20], 
                   'b': [10, 20]})
print (df)
               l                a  dontcare   s   b
0      [1, 2, 4]  [foo, bar, baz]        10  10  10
1  [3, 2, 0, 10]      [qux, quux]        20  20  20

df = pd.DataFrame([(a[1], b[0]) for a,b, *c in df.values], columns=['l', 'a'])
print (df)
   l    a
0  2  foo
1  2  qux

或者 select 按list进行处理:

df = pd.DataFrame([(a[1], b[0]) for a,b in df[['l','a']].values], columns=['l', 'a'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM