从每行拆分2d数组将其添加到新行pandas数据框

时间:2019-02-15 18:01:23

标签: python pandas

我有一个suspend fun fetchItems(): List<MyClass> { return client.get<MyClassList>(URL).items } ,看起来像这样

dataframe

我想将其转换为以下A B 1 [[1], [2]] 2 [[1, 2], [3, 4]] 3 [[1, 2, 3, 4, 5], [6, 7, 8, 9]]

dataframe

此转换是否有任何干净的方法?

到目前为止,我已经编写了这段代码。

A   C     D
1   1     2
2   1     3
2   2     4
3   1     6
3   2     7
3   3     8
3   4     9

谢谢

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

A = [l[0] for l in df["B"]]
B = [l[1] for l in df["B"]]
A = [A[i][:len(B[i])] for i in range(len(A))]

A2 = []
C = []
D = []
idx = 1
for a, b in zip(A, B):
    for x, y in zip(a, b):
        A2.append(idx)
        C.append(x)
        D.append(y)
    idx += 1

df = pd.DataFrame({"A": A2, "C": C, "D": D})

输出:

    A   C   D
0   1   1   2
1   2   1   3
2   2   2   4
3   3   1   6
4   3   2   7
5   3   3   8
6   3   4   9

答案 1 :(得分:0)

您在问题中提供不一致的数据。在第一部分中,嵌套列表的长度不相等,而编辑确实之后的替代示例具有相同长度的嵌套列表。

我在下面的解决方案中假设后者,即嵌套列表的长度相等。

# generate data
df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": [
        [[1], [2]],
        [[1, 2], [3, 4]],
        [[1, 2, 3, 4], [6, 7, 8, 9]]
    ]})

# create new columns C & D
df = pd.concat([df.A, df.B.apply(pd.Series)], axis=1)
df.columns = ['A', 'C', 'D']

输出:

   A             C             D
0  1           [1]           [2]
1  2        [1, 2]        [3, 4]
2  3  [1, 2, 3, 4]  [6, 7, 8, 9]

现在爆炸嵌套列表。

col_a, col_c, col_d = [], [], []
lens = df.D.agg(len).to_list()

for i in range(df.shape[0]):
    col_a.extend([df.A.iloc[i]] * lens[i])

for i in df.C:
    col_c.extend(i)

for i in df.D:
    col_d.extend(i)

df1 = pd.DataFrame({"A": col_a, "C": col_c, "D": col_d})

输出:

   A  C  D
0  1  1  2
1  2  1  3
2  2  2  4
3  3  1  6
4  3  2  7
5  3  3  8
6  3  4  9