Pandas Series of lists to one series
我有一系列的熊猫串:
1 2 3 | 0 [slim, waist, man] 1 [slim, waistline] 2 [santa] |
如您所见,列表的长度不同。我想要一个有效的方法把这个分解成一个系列
1 2 3 4 5 6 | 0 slim 1 waist 2 man 3 slim 4 waistline 5 santa |
我知道我可以用
1 | series_name.split(' ') |
但我很难把这些字符串放回一个列表中。
谢谢!
以下是仅使用熊猫函数的简单方法:
1 2 3 4 5 6 | import pandas as pd s = pd.Series([ ['slim', 'waist', 'man'], ['slim', 'waistline'], ['santa']]) |
。
然后
1 | s.apply(pd.Series).stack().reset_index(drop=True) |
提供所需的输出。在某些情况下,您可能希望保存原始索引并添加第二个级别来索引嵌套元素,例如。
1 2 3 4 5 6 | 0 0 slim 1 waist 2 man 1 0 slim 1 waistline 2 0 santa |
。
如果这是你想要的,只需从链中省略
您基本上只是想在这里展平嵌套列表。
您应该能够迭代系列的元素:
1 2 3 | slist =[] for x in series: slist.extend(x) |
或者一个圆滑(但更难理解)的列表理解:
1 | slist = [st for row in s for st in row] |
。
您可以尝试使用itertools.chain简化列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | In [70]: from itertools import chain In [71]: import pandas as pnd In [72]: s = pnd.Series([['slim', 'waist', 'man'], ['slim', 'waistline'], ['santa']]) In [73]: s Out[73]: 0 [slim, waist, man] 1 [slim, waistline] 2 [santa] dtype: object In [74]: new_s = pnd.Series(list(chain(*s.values))) In [75]: new_s Out[75]: 0 slim 1 waist 2 man 3 slim 4 waistline 5 santa dtype: object |
。
1 | series_name.sum() |
做你所需要的。请确保它是一系列列表,否则您的值将被连接(如果是字符串)或添加(如果是int)
可以使用此函数进行展平和取消展平
1 2 3 4 5 6 7 | def flatten(df, col): col_flat = pd.DataFrame([[i, x] for i, y in df[col].apply(list).iteritems() for x in y], columns=['I', col]) col_flat = col_flat.set_index('I') df = df.drop(col, 1) df = df.merge(col_flat, left_index=True, right_index=True) return df |
。
取消修饰:
1 2 | def unflatten(flat_df, col): flat_df.groupby(level=0).agg({**{c:'first' for c in flat_df.columns}, col: list}) |
号
取消填充后,我们得到相同的数据帧,除了列顺序:
1 2 | (df.sort_index(axis=1) == unflatten(flatten(df)).sort_index(axis=1)).all().all() >> True |
号
您可以使用下面的列表串联操作符-
1 2 3 4 5 | lst1 = ['hello','world'] lst2 = ['bye','world'] newlst = lst1 + lst2 print(newlst) >> ['hello','world','bye','world'] |
或者您可以使用下面的
1 2 3 4 5 | lst1 = ['hello','world'] lst2 = ['bye','world'] lst1.extend(lst2) print(lst1) >> ['hello', 'world', 'bye', 'world'] |
号
使用
1 2 | lst1.extend(('Bye','Bye')) >> ['hello', 'world', 'Bye', 'Bye'] |