在列表中解开列表
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]
我有一个 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]