创建行并附加到数据框
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
我想用这样定义的行和列创建一个数据框
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