从具有不等长度和 NaN 值的列表列表创建 pandas 数据框
Create pandas dataframe from list of lists with unequal lengths and NaN values
鉴于以下情况:
a = [
[1],
[1, 2],
[1, 2, 3],
[],
[1, 2, 3, 4],
np.nan,
[1, 2, 3, 4, 5],
]
如何着手创建:
import pandas as pd
import numpy as np
n = np.nan
# to this
n = np.nan
dt = pd.DataFrame(
{
"col_1": [1, 1, 1, n, 1, n, 1],
"col_2": [n, 2, 2, n, 2, n, 2],
"col_3": [n, n, 3, n, 3, n, 3],
"col_4": [n, n, n, n, 4, n, 4],
"col_5": [n, n, n, n, n, n, 5],
}
)
尝试
以下似乎有效:
s = pd.Series([x if str(x) != "nan" else [] for x in a])
s.astype(str).str.split(",", expand=True).applymap(
lambda x: str(x).replace("[", "").replace("]", "")
).rename(columns=lambda x: f"col_{x+1}")
但感觉不是很地道。
试试这个:
result=pd.DataFrame()
for sub in a:
result = result.append([sub])
此代码将每个子列表添加为一行
输出:
| | 0 | 1 | 2 | 3 | 4 |
|---:|----:|----:|----:|----:|----:|
| 0 | 1 | nan | nan | nan | nan |
| 0 | 1 | 2 | nan | nan | nan |
| 0 | 1 | 2 | 3 | nan | nan |
| 0 | nan | nan | nan | nan | nan |
| 0 | 1 | 2 | 3 | 4 | nan |
| 0 | nan | nan | nan | nan | nan |
| 0 | 1 | 2 | 3 | 4 | 5 |
只需将所有列表元素设为列表即可:
pd.DataFrame([x if isinstance(x, list) else [x] for x in a])
要重命名原始示例中给出的列,您可以使用:
pd.DataFrame([x if isinstance(x, list) else [x] for x in a]).rename(columns = lambda x: f"col_{x+1}")
给出:
col_1 col_2 col_3 col_4 col_5
0 1.0 NaN NaN NaN NaN
1 1.0 2.0 NaN NaN NaN
2 1.0 2.0 3.0 NaN NaN
3 NaN NaN NaN NaN NaN
4 1.0 2.0 3.0 4.0 NaN
5 NaN NaN NaN NaN NaN
6 1.0 2.0 3.0 4.0 5.0
这可以是其中一种方式。
import pandas as pd
import numpy as np
a = [
[1],
[1, 2],
[1, 2, 3],
[],
[1, 2, 3, 4],
np.nan,
[1, 2, 3, 4, 5],
]
num=0
list_dict = {}
for list in a:
list_dict[num] = pd.Series(list)
num+=1
df = pd.DataFrame(list_dict).T
print(df)
输出:
+----+-----+-----+-----+-----+-----+
| | 0 | 1 | 2 | 3 | 4 |
|----+-----+-----+-----+-----+-----|
| 0 | 1 | nan | nan | nan | nan |
| 1 | 1 | 2 | nan | nan | nan |
| 2 | 1 | 2 | 3 | nan | nan |
| 3 | nan | nan | nan | nan | nan |
| 4 | 1 | 2 | 3 | 4 | nan |
| 5 | nan | nan | nan | nan | nan |
| 6 | 1 | 2 | 3 | 4 | 5 |
+----+-----+-----+-----+-----+-----+
鉴于以下情况:
a = [
[1],
[1, 2],
[1, 2, 3],
[],
[1, 2, 3, 4],
np.nan,
[1, 2, 3, 4, 5],
]
如何着手创建:
import pandas as pd
import numpy as np
n = np.nan
# to this
n = np.nan
dt = pd.DataFrame(
{
"col_1": [1, 1, 1, n, 1, n, 1],
"col_2": [n, 2, 2, n, 2, n, 2],
"col_3": [n, n, 3, n, 3, n, 3],
"col_4": [n, n, n, n, 4, n, 4],
"col_5": [n, n, n, n, n, n, 5],
}
)
尝试
以下似乎有效:
s = pd.Series([x if str(x) != "nan" else [] for x in a])
s.astype(str).str.split(",", expand=True).applymap(
lambda x: str(x).replace("[", "").replace("]", "")
).rename(columns=lambda x: f"col_{x+1}")
但感觉不是很地道。
试试这个:
result=pd.DataFrame()
for sub in a:
result = result.append([sub])
此代码将每个子列表添加为一行
输出:
| | 0 | 1 | 2 | 3 | 4 |
|---:|----:|----:|----:|----:|----:|
| 0 | 1 | nan | nan | nan | nan |
| 0 | 1 | 2 | nan | nan | nan |
| 0 | 1 | 2 | 3 | nan | nan |
| 0 | nan | nan | nan | nan | nan |
| 0 | 1 | 2 | 3 | 4 | nan |
| 0 | nan | nan | nan | nan | nan |
| 0 | 1 | 2 | 3 | 4 | 5 |
只需将所有列表元素设为列表即可:
pd.DataFrame([x if isinstance(x, list) else [x] for x in a])
要重命名原始示例中给出的列,您可以使用:
pd.DataFrame([x if isinstance(x, list) else [x] for x in a]).rename(columns = lambda x: f"col_{x+1}")
给出:
col_1 col_2 col_3 col_4 col_5
0 1.0 NaN NaN NaN NaN
1 1.0 2.0 NaN NaN NaN
2 1.0 2.0 3.0 NaN NaN
3 NaN NaN NaN NaN NaN
4 1.0 2.0 3.0 4.0 NaN
5 NaN NaN NaN NaN NaN
6 1.0 2.0 3.0 4.0 5.0
这可以是其中一种方式。
import pandas as pd
import numpy as np
a = [
[1],
[1, 2],
[1, 2, 3],
[],
[1, 2, 3, 4],
np.nan,
[1, 2, 3, 4, 5],
]
num=0
list_dict = {}
for list in a:
list_dict[num] = pd.Series(list)
num+=1
df = pd.DataFrame(list_dict).T
print(df)
输出:
+----+-----+-----+-----+-----+-----+
| | 0 | 1 | 2 | 3 | 4 |
|----+-----+-----+-----+-----+-----|
| 0 | 1 | nan | nan | nan | nan |
| 1 | 1 | 2 | nan | nan | nan |
| 2 | 1 | 2 | 3 | nan | nan |
| 3 | nan | nan | nan | nan | nan |
| 4 | 1 | 2 | 3 | 4 | nan |
| 5 | nan | nan | nan | nan | nan |
| 6 | 1 | 2 | 3 | 4 | 5 |
+----+-----+-----+-----+-----+-----+