创建行并附加到数据框

Create rows and append to dataframe

我想用这样定义的行和列创建一个数据框

     1   2   3   4
 A
 B
 C

并用两个循环填充它。我写了这个:

list1 = ['1', '2', '3', '4']
list2 = ['A', 'B', 'C']

df1 = pd.DataFrame()
cnt = 0
for l2 in range(len(list2)):
    vec = []
    for l1 in range(len(list1)):
        vec.append(cnt)
        cnt += 1
    tmp_row = {list2[l2], vec}   # <-- Error
    tmp = pd.DataFrame([tmp_row])
    df1 = pd.concat([df1, tmp], axis=0, ignore_index=True)
    print(df1)

所以在外循环的第一次迭代中,我希望有

     1   2   3   4
 A   0   1   2   3

然后

     1   2   3   4
 A   0   1   2   3
 B   4   5   6   7

等等。但是,在 tmp_row,我得到这个错误

TypeError: unhashable type: 'list'

如何修复错误?


更新:

在这个片段中,我使用了一个计数器。在我的代码中,这不是一个简单的计数器。所以,假设是这样的:

cnt = foo()
vec.append(cnt)

因此,一行类似于 A 0.2 0.41 -0.03 0.1 等等。

您可以在数据框生成中使用列表理解来做到这一点(假设 foo() returns 一个 len(list1) 值的列表):

df = pd.DataFrame([foo() for _ in range(len(list2))], columns=list1, index=list2)

或者如果 foo() 一次仅 returns 一个值:

df = pd.DataFrame([[foo() for i in range(len(list1))] for j in range(len(list2))],
                  columns=list1, index=list2)

如果foo()是一个计数器,结果将是:

   1  2   3   4
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11

您可以创建没有循环的数据框

out = pd.DataFrame(np.arange(12).reshape(-1,4), columns = list1, index = list2)
Out[14]: 
   1  2   3   4
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11

如果你真的想使用你的循环(我还是不明白为什么),这里是解决方法:

list1 = ['1', '2', '3', '4']
list2 = ['A', 'B', 'C']

df1 = pd.DataFrame()
cnt = 0
for l2 in range(len(list2)):
    vec = []
    for l1 in range(len(list1)):
        vec.append(cnt)
        cnt += 1
    tmp = pd.DataFrame([vec], index=[list2[l2]])
    df1 = pd.concat([df1, tmp], axis=0)
    print(df1, end='\n\n')

输出:

   0  1  2  3
A  0  1  2  3

   0  1  2  3
A  0  1  2  3
B  4  5  6  7

   0  1   2   3
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11

备选

可能效率更高,收集所有数据并最终创建 DataFrame:

list1 = ['1', '2', '3', '4']
list2 = ['A', 'B', 'C']


cnt = 0
d = {}
for l2 in range(len(list2)):
    vec = []
    for l1 in range(len(list1)):
        vec.append(cnt)
        cnt += 1
    d[list2[l2]] = vec
    
df1 = pd.DataFrame.from_dict(d, orient='index')

输出:

   0  1   2   3
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11