如果这很简单,请原谅我。我是Python的新手,自学成才。
我有一个包含CSV文件的文件夹。每个文件代表一个记录,并且包含一列(每个文件中没有标题的总共5列),我想将其聚合到包含所有记录的单个数据框中。在最后一个数据框中,我希望第一列是记录号,然后其余的列是文件中的值。某些记录将具有更多或更少的值,因此大多数记录在某些列中将具有NaN。
我已经解决了问题,但我想知道是否还有更优雅的解决方案。特别是,我创建dfs列表,将dfs附加到列表,连接它们,转置它们,然后将其与记录号连接起来的方式似乎有些笨拙。这是我的代码:
import pandas as pd
import numpy as np
start_record = 64090
end_record = 64092
record_range = pd.Series(data = np.arange(start_record, end_record + 1))
record_df = pd.DataFrame(data = record_range, columns = ["record_num"])
lst = []
for record in record_range:
profile_df = pd.read_csv("record-" + str(record) + ".csv", names = ["second","val1","val2","val3","val4"])
lst.append(profile_df["val1"])
profiles_df = pd.concat(lst,axis = 1,)
profiles_df_t = profiles_df.T
profiles_df_t = profiles_df_t.reset_index(drop=True)
total = pd.concat([record_df,profiles_df_t], axis = 1)
您将如何处理?
答案 0 :(得分:2)
使用dict
存储以记录号为键的系列。如果您使用python 3,请f-strings
使文件名语法更好一点。
import numpy as np
import pandas as pd
start_record = 64090
end_record = 64092
record_range = np.arange(start_record, end_record+1)
d = {}
for record in record_range:
profile_df = pd.read_csv(f'record-{record}.csv',
names=['second', 'val1', 'val2', 'val3', 'val4'])
d[record] = profile_df['val1']
total = pd.DataFrame.from_dict(d, orient='index')
我认为您的原始方法没有内在的错误。如果使用record
重命名Series,则可以避免某些级联和索引重置。 (我认为dict
解决方案更简单,但是为了完整性起见会添加它。)
lst = []
for record in record_range:
profile_df = pd.read_csv(f'record-{record}.csv',
names=['second', 'val1', 'val2', 'val3', 'val4'])
lst.append(profile_df['val1'].rename(record))
total = pd.concat(lst, axis=1).T