我对Python和Pandas还是很陌生。我需要一些正在使用的代码的帮助。
我有一本名为df
的字典,其中包含一些文件及其txt格式的内容。该词典的关键字是文件名(date.txt),值是其内容。看起来是这样的:
{'02_01_2020': 0
0 1 229017 Cust_1 CUR ...
1 2 629324 Cust_2 CUR ...
2 3 863300 Cust_3 CUR ...
3 4 670338 Cust_4 CUR ...
4 5 987039 Cust_5 CUR ...
5 6 485912 Cust_6 CUR ...,'03_01_2020': 0
0 1 122403 Cust_1 CUR ...
1 2 779269 Cust_2 CUR ...
2 3 728965 Cust_3 CUR ...
3 4 527716 Cust_4 CUR ...
4 5 796179 Cust_5 CUR ...
5 6 027872 Cust_6 CUR ...
6 7 449767 Cust_7 CUR ...
7 8 598752 Cust_8 CUR ...
8 9 180422 Cust_9 CUR ..., .... goes until the last file ('31_01_2020')}
如上所述,每个文件包含不同的数据。文件02_01_2020.txt有6个条目,文件03_01_2020.txt有9个条目,依此类推,直到最后一个文件(31_01_2020.txt)。
我在这里的目标是将必要的信息分为自己的列(客户名称,货币等),并将文件名插入一个单独的列,该列称为paid_date。我用iterrows()
遍历了这个字典文件。这是代码:
def data_process(df):
#dataframe that i created outside this function
global df_data_1
for key,value in df.items():
df1 = pd.DataFrame(value)
df1['Paid_date'] = key.replace('_', '/')
#df1.insert(1, 'Paid_date', key.replace('_','/')) - another attempt to insert the col
for index,row in df1.iterrows():
df_Item_Num = row.str.slice(start = 0, stop=2) # entry number
df_DUMP_1 = row.str.slice(start = 0, stop=23) # not used
df_NAME = row.str.slice(start = 23, stop=40)
df_CURRENCY = row.str.slice(start = 40, stop=54)
df_AMOUNT = row.str.slice(start = 54, stop=66)
df_DATE = row.str.slice(start = 68, stop=86)
df_DUMP_2 = row.str.slice(start = 87, stop=-1) # not used
df_ALL_ITEMS = pd.concat([df_Item_Num, df_NAME, df_CURRENCY, df_AMOUNT, df_DATE], ignore_index=True)
df_data_1 = df_data_1.append(df_ALL_ITEMS, ignore_index=True)
return df_data_1
当我禁用传递键的df1['Paid_date'] = key.replace('_', '/')
列创建代码时,结果如下所示:
0 1 2 3 4
0 1 Cust_1 CUR Amount Date_Time
1 2 Cust_2 CUR Amount Date_Time
2 3 Cust_3 CUR Amount Date_Time
3 4 Cust_4 CUR Amount Date_Time
4 5 Cust_5 CUR Amount Date_Time
.. .. ... ... ... ...
185 10 Cust_6 CUR Amount Date_Time
186 11 Cust_7 CUR Amount Date_Time
187 12 Cust_8 CUR Amount Date_Time
188 13 Cust_9 CUR Amount Date_Time
189 14 Cust_10 CUR Amount Date_Time
这正是我所需要的,仅不包括paid_date列(我需要将文件名存储在对应于该特定文件的每一行中。例如02_01_2020将被打印6次至6行,03_01_2020至9行等)。但是,当我启用列创建代码时,它最终像这样:
0 1 2 3 ... 6 7 8 9
0 1 02 Cust_1 ... Amount Date_Time
1 2 02 Cust_2 ... Amount Date_Time
2 3 02 Cust_3 ... Amount Date_Time
3 4 02 Cust_4 ... Amount Date_Time
4 5 02 Cust_5 ... Amount Date_Time
.. .. .. ... .. ... ... .. ... ..
185 10 31 Cust_6 ... Amount Date_Time
186 11 31 Cust_7 ... Amount Date_Time
187 12 31 Cust_8 ... Amount Date_Time
188 13 31 Cust_9 ... Amount Date_Time
189 14 31 Cust_10 ... Amount Date_Time
我有几个新的空列,显然键(文件名)没有完全插入(仅以某种方式将日期存储在新列中,不包括月份和年份)。解决此问题的最有效方法是什么?任何帮助将不胜感激。谢谢
编辑1
我正在使用的每个txt文件的条目如下所示:
1 CUST_NAME_1 CURRENCY AMOUNT DATE_TIME
2 CUST_NAME_2 CURRENCY AMOUNT DATE_TIME
3 CUST_NAME_3 CURRENCY AMOUNT DATE_TIME
4 CUST_NAME_4 CURRENCY AMOUNT DATE_TIME
5 CUST_NAME_5 CURRENCY AMOUNT DATE_TIME
在txt文件中,有很多空格将信息分隔开,如上所示。我的代码首先要做的是遍历计算机中存储所有文件的目录,并将它们附加到两个列表中。这是代码:
#SET UP EMPTY LISTS & Dictionary
filelist = []
filename = []
df = {}
def file_process(mydir):
for path, dirs, files in os.walk(mydir):
for file in files:
if file.endswith('.txt'):
filelist.append(file)
filename.append(file[0:10])
return filelist, filename
上面的代码返回两个列表。
然后,我编写了以下代码,将这两个列表转换为单个字典(感谢您的建议,避免使用df作为字典名称)。
def dict_process(filelist, filename):
for key in filename:
for value in filelist:
df[key] = pd.read_csv(value, sep="delimiter", skiprows = [0,1,2,3,4,5,6,7,8], skipfooter=6, header=None)
filelist.remove(value)
break
return df
上面的代码返回我先前编写的字典,其中文件名设置为键,所有文件内容为其值。
我在for index,row in df1.iterrows():
中所做的(或认为我做了)是对iterrows()
返回的每个序列进行切片,并仅保留我想要的信息并将它们连接到一个空的数据框中。这样有效吗?还是有另一种方法?