如何在python中的每个for循环之后在DataFrame中添加行,最好是在pandas中迭代更新
这是我的.csv文件如何在python中的每个for循环之后在DataFrame中添加行,最好是在pandas中迭代更新,python,pandas,reshape,concat,Python,Pandas,Reshape,Concat,这是我的.csv文件 Choco_Type,ID,Cocoa,Milk,Sugar,ID,Cocoa,Milk,Sugar Dark,Batch_11,80,0,16,Batch_12,78,0,14 Milk,Batch_72,35,25,25,Batch_73,32,27,22 Swiss,Batch_52,30,30,20,Batch_53,28,33,18 这是我的密码 for row in reader_in: type_chocolate=row[0] a=
Choco_Type,ID,Cocoa,Milk,Sugar,ID,Cocoa,Milk,Sugar
Dark,Batch_11,80,0,16,Batch_12,78,0,14
Milk,Batch_72,35,25,25,Batch_73,32,27,22
Swiss,Batch_52,30,30,20,Batch_53,28,33,18
这是我的密码
for row in reader_in:
type_chocolate=row[0]
a= [(type_chocolate,row[1],row[2],row[3],row[4]),(type_chocolate,row[5],row[6],row[7],row[8])]
df=DataFrame.from_records(a)
这应该是我的输出数据帧
Choco_Type ID Cocoa Milk Sugar
Dark Batch_11 80 0 16
Dark Batch_12 78 0 14
Milk Batch_72 35 25 25
Milk Batch_73 32 27 22
Swiss Batch_52 30 30 20
Swiss Batch_53 28 33 18
我无法理解如何在每次“for”循环后使用新行更新数据框“df”,这些新行通过使用“from_records”函数进行更新,该函数从读取器中获取一个可编辑列表作为其输入首先用于从csv
创建数据框
然后.1
将为列名称中没有重复项而添加的内容作为空字符串
使用第一列并通过以下方式选择第一列和最后一列4
:
如果需要通过所需输出更改顺序:
df.columns = df.columns.str.replace('.1', '')
df = df.set_index('Choco_Type')
df = pd.concat([df.iloc[:, :4], df.iloc[:, 4:]], keys=(1,2), axis=1)
.stack(0)
.reset_index(level=1, drop=True)
.reset_index()
print (df)
Choco_Type ID Cocoa Milk Sugar
0 Dark Batch_11 80 0 16
1 Dark Batch_12 78 0 14
2 Milk Batch_72 35 25 25
3 Milk Batch_73 32 27 22
4 Swiss Batch_52 30 30 20
5 Swiss Batch_53 28 33 18
另一种通过dict
创建的pd.lreshape
解决方案是dict-comprehension
,该解决方案的列名不包含.1
,也需要删除Choco_类型
:
cols = df.columns[~((df.columns.str.contains('.1')) | (df.columns == 'Choco_Type'))]
print (cols)
Index(['ID', 'Cocoa', 'Milk', 'Sugar'], dtype='object')
d = {x: df.columns[df.columns.str.contains(x)].tolist() for x in cols}
print (d)
{'Milk': ['Milk', 'Milk.1'],
'Sugar': ['Sugar', 'Sugar.1'],
'ID': ['ID', 'ID.1'],
'Cocoa': ['Cocoa', 'Cocoa.1']}
df = pd.lreshape(df, d)
print (df)
Choco_Type Milk Sugar ID Cocoa
0 Dark 0 16 Batch_11 80
1 Milk 25 25 Batch_72 35
2 Swiss 30 20 Batch_52 30
3 Dark 0 14 Batch_12 78
4 Milk 27 22 Batch_73 32
5 Swiss 33 18 Batch_53 28
问题,为什么一次只加载一行?为什么不使用
read_table
或read_csv
读取整个文件?我读取了完整的csv文件,但我正在修改每一行,进一步我想从中创建一个数据帧。1在str.replace中的含义是什么。它意味着列名是ID.1
,因此需要删除。1
(在pandas 0.19.2中存在此问题,在一些旧版本中,如果列名重复,pandas不会添加.1
)非常感谢!!!但是你能给我解释一下什么是重置索引以及它在这里是如何使用的吗?当然,你可以检查一下。我从第一列Choco\u Type
为Dataframe
创建索引,所有数据都用于重塑。在concat之后,仍然Choco\u Type
是索引,所以我使用reset\u index
从索引创建列。我得到了我使用filename.csv时糖的NAN值
cols = df.columns[~((df.columns.str.contains('.1')) | (df.columns == 'Choco_Type'))]
print (cols)
Index(['ID', 'Cocoa', 'Milk', 'Sugar'], dtype='object')
d = {x: df.columns[df.columns.str.contains(x)].tolist() for x in cols}
print (d)
{'Milk': ['Milk', 'Milk.1'],
'Sugar': ['Sugar', 'Sugar.1'],
'ID': ['ID', 'ID.1'],
'Cocoa': ['Cocoa', 'Cocoa.1']}
df = pd.lreshape(df, d)
print (df)
Choco_Type Milk Sugar ID Cocoa
0 Dark 0 16 Batch_11 80
1 Milk 25 25 Batch_72 35
2 Swiss 30 20 Batch_52 30
3 Dark 0 14 Batch_12 78
4 Milk 27 22 Batch_73 32
5 Swiss 33 18 Batch_53 28