Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中的每个for循环之后在DataFrame中添加行,最好是在pandas中迭代更新_Python_Pandas_Reshape_Concat - Fatal编程技术网

如何在python中的每个for循环之后在DataFrame中添加行,最好是在pandas中迭代更新

如何在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=

这是我的.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= [(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