簡體   English   中英

如果pandas系列的值是一個列表,如何獲取每個元素的子列表?

[英]If the value of pandas series is a list, how to get a subList of each element?

使用兩個Pandas系列: series1series2 ,我願意制作series3 series1的每個值都是一個列表, series2的每個值都是series1的對應索引。

>>> print(series1)

0      [481, 12, 11, 220, 24, 24, 645, 153, 15, 13, 6...
1      [64, 80, 79, 147, 14, 20, 56, 288, 12, 208, 26...
4      [5, 6, 152, 31, 295, 127, 711, 5, 271, 291, 11...
5          [363, 121, 727, 249, 483, 122, 241, 494, 555]
7      [112, 20, 41, 9, 104, 131, 26, 298, 65, 214, 1...
9      [129, 797, 19, 151, 448, 47, 19, 106, 299, 144...
11     [72, 35, 25, 200, 122, 5, 75, 30, 208, 24, 14,...
18     [137, 339, 71, 14, 19, 54, 61, 15, 73, 104, 43...



>>> print(series2)

0       0
1       3
4       1
5       6
7       4
9       5
11      7
18      2

我期待的是:

>>> print(series3)

0      [481, 12, 11, 220, 24, 24, 645, 153, 15, 13, 6...
1      [147, 14, 20, 56, 288, 12, 208, 26...
4      [6, 152, 31, 295, 127, 711, 5, 271, 291, 11...
5      [241, 494, 555]
7      [104, 131, 26, 298, 65, 214, 1...
9      [47, 19, 106, 299, 144...
11     [30, 208, 24, 14,...
18     [71, 14, 19, 54, 61, 15, 73, 104, 43...

我的解決方法1:從事實和系列1 系列2的長度相等,我可以做一個for循環迭代系列1和計算類似series1.ix[i][series2.ix[i]] ,並作出新系列( series3 )保存結果。

我的解決方案2 :使用df = pd_concat([series1, series2])生成dataFrame df,並創建一個新列(使用apply函數的行方式操作 - 例如,df ['series3'] = df.apply(lambda x: subList(x),axis = 1)。

但是,我認為上面兩種解決方案並不是實現我想要的方式。 如果你建議更整潔的解決方案,我將不勝感激

如果您希望避免創建中間pd.DataFrame ,並且只需要新的pd.Series ,則可以在map對象上使用pd.Series構造函數。 所以給出:

In [6]: S1
Out[6]:
0    [481, 12, 11, 220, 24, 24, 645, 153, 15, 13, 6]
1    [64, 80, 79, 147, 14, 20, 56, 288, 12, 208, 26]
2    [5, 6, 152, 31, 295, 127, 711, 5, 271, 291, 11]
3      [363, 121, 727, 249, 483, 122, 241, 494, 555]
4    [112, 20, 41, 9, 104, 131, 26, 298, 65, 214, 1]
5    [129, 797, 19, 151, 448, 47, 19, 106, 299, 144]
6     [72, 35, 25, 200, 122, 5, 75, 30, 208, 24, 14]
7    [137, 339, 71, 14, 19, 54, 61, 15, 73, 104, 43]
dtype: object

In [7]: S2
Out[7]:
0    0
1    3
2    1
3    6
4    4
5    5
6    7
7    2
dtype: int64

你可以做:

In [8]: pd.Series(map(lambda x,y : x[y:], S1, S2), index=S1.index)
Out[8]:
0    [481, 12, 11, 220, 24, 24, 645, 153, 15, 13, 6]
1                [147, 14, 20, 56, 288, 12, 208, 26]
2       [6, 152, 31, 295, 127, 711, 5, 271, 291, 11]
3                                    [241, 494, 555]
4                    [104, 131, 26, 298, 65, 214, 1]
5                            [47, 19, 106, 299, 144]
6                                  [30, 208, 24, 14]
7              [71, 14, 19, 54, 61, 15, 73, 104, 43]
dtype: object

如果要在不創建中間容器的情況下修改S1 ,可以使用for循環:

In [10]: for i, x in enumerate(map(lambda x,y : x[y:], S1, S2)):
    ...:     S1.iloc[i] = x
    ...:

In [11]: S1
Out[11]:
0    [481, 12, 11, 220, 24, 24, 645, 153, 15, 13, 6]
1                [147, 14, 20, 56, 288, 12, 208, 26]
2       [6, 152, 31, 295, 127, 711, 5, 271, 291, 11]
3                                    [241, 494, 555]
4                    [104, 131, 26, 298, 65, 214, 1]
5                            [47, 19, 106, 299, 144]
6                                  [30, 208, 24, 14]
7              [71, 14, 19, 54, 61, 15, 73, 104, 43]
dtype: object

你基本上可以連接指定wich軸的系列(0 =行,1列),更好的是相同的長度

series3=pd.concat([series2, series1], axis=1).reset_index()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM