在列表中解开列表

Unravel list within list

我有一个 jupyter notebook,包含一个 pandas 数据框,有一列 PAR (dtype = obj)。

+------+------------------+
|      | PAR              |
+------+------------------+
| 0    | [[1.2.3, 2.3.4]] |
+------+------------------+
| 1    | [[3.2, 3.2]]     |
+------+------------------+

我不明白如何将每一行中的每个 [[list]] 'clean' 变成类似 [list] 的东西。

我可以打印行内容:

print(df['PAR'][1])
print(', '.join(df['PAR'][1][0]))

这输出:

[['3.2', '3.2']] 
3.2, 3.2

我也可以'strip'每个单元格变成一个字符串:

# df['PAR'] = df['PAR'].astype(str)
df['PAR'].replace(r'\[','', regex=True, inplace=True) 
df['PAR'].replace(r'\]','', regex=True, inplace=True) 
df['PAR'].replace(r'\'','', regex=True, inplace=True)

这给出了一个干净的字符串,虽然这不是我需要的格式:

3.2, 3.2

但是,我正在寻找的是我的 df 的每一行中的 1 级列表,如下所示:

+------+------------------+------------------+
|      | PAR              | PAR list         |
+------+------------------+------------------+
| 0    | [[1.2.3, 2.3.4]] | [1.2.3, 2.3.4]   |
+------+------------------+------------------+
| 1    | [[3.2, 3.2]]     | [3.2, 3.2]       |
+------+------------------+------------------+

(逗号和第 n 个元素之间的空格只是为了更好地阅读上面的 table)。

执行此操作的常用方法是什么?

我的下一步是将每个新列表转换为仅包含唯一元素的列表,遵循此线程: Get unique values from a list in python

mylist = ['nowplaying', 'PBS', 'PBS', 'nowplaying', 'job', 'debate', 'thenandnow']
myset = set(mylist)
mynewlist = list(myset)

因此,如果您对 'unlist' 每行中的列表提供一些帮助,我将不胜感激。具有 lambda 函数的解决方案(.join 的 .map?)对我来说很容易处理。

输入数据:

>>> df
                PAR
0  [[1.2.3, 2.3.4]]
1      [[3.2, 3.2]]

取消列出*并一步删除重复项:

df["PAR"] = df["PAR"].str[0].apply(np.unique)

输出数据:

>>> df
              PAR
0  [1.2.3, 2.3.4]
1           [3.2]

* 在@SeanBean

的帮助下更正

您可以简单地使用.str[0]访问外部列表的第一个也是唯一一个元素,有效地删除一个列表级别,如下所示:

df['PAR list'] = df['PAR'].str[0]

测试数据准备:

data = {'PAR': [
[['1.2.3', '2.3.4']],
[['3.2', '3.2']]]
}
df = pd.DataFrame(data)

print(df)

                PAR
0  [[1.2.3, 2.3.4]]
1      [[3.2, 3.2]]

运行 新密码:

 df['PAR list'] = df['PAR'].str[0]

结果:

print(df)

                PAR        PAR list
0  [[1.2.3, 2.3.4]]  [1.2.3, 2.3.4]
1      [[3.2, 3.2]]      [3.2, 3.2]