我有多个文件夹,每个文件夹都包含多个"tsv";文件。我需要附加";TESS";16个不同文件的列组成一个空数据帧,并具有相应的索引。我创建了一个空框架;"满";名为"all_methods"
的索引-该索引由分离的16个文件中的所有可用变量组成。如何保存";TESS";列值按顺序分别放入每列中?例如:第一次打印转到";C1〃;,仅次于";C2";,第三到";E1〃;等等。索引必须匹配,但我已经放了isin索引。*注意,如果空框和打印框之间不匹配,Nan是好的
os.chdir(r'....')
c4_add = pd.read_csv('c4symbols.csv', index_col=[0], usecols=[0])
c5_add = pd.read_csv('c5symbols.csv', index_col=[0], usecols=[0])
c6_add = pd.read_csv('c6symbols.csv', index_col=[0], usecols=[0])
c7_add = pd.read_csv('c7symbols.csv', index_col=[0], usecols=[0])
combined_symbols = c4_add.combine(c5_add, c6_add, c7_add)
combined_symbols = combined_symbols.index[1:-1]
all_methods = pd.DataFrame(index=combined_symbols, columns = ['C1','C2','E1','E2','M1','M2','M3','M4',
'Q1','Q2','Q3','T1','T2','T3','X1','X2'])
for root,dirs, files in os.walk(r'.....'):
for file in files:
if file.endswith(".tsv") and file.__contains__('report_for_na'):
with open(os.path.join(root,file), 'r') as auto:
df = pd.read_table(auto, sep='t')
if len(df.T) == 12:
df.set_index('NAME', inplace = True)
df = df[['TESS']]
df = df[df.index.isin(all_methods.index)]
for i in df['TESS']:
for a in all_methods:
d = pd.DataFrame({a:i}, index = all_methods.index)
print(d) -- > I did something wrong in the loop ..
IIUC-您似乎需要按索引进行水平合并。因此,请考虑使用已定义的方法导入每个.tsv并运行所需的数据帧操作。然后调用列表理解中的方法来构建数据帧列表。并不是在所有文件之间迭代,而是在所有目录之间添加一个中间循环,以正确引用绝对名称的文件。
然后,使用pandas.concat
运行水平合并(将axis
默认值调整为axis=1
(。最后,运行DataFrame.join
以加入匹配索引上的all_methods
主数据帧。注意:以下内容未经测试,因此可能需要您进行调整。
def get_tsv_data(f):
# DIRECT READ OF TEXT FILE
raw = pd.read_table(f, sep='t')
if len(df.T) == 12:
# SET INDEX AND KEEP ONLY TESS COLUMN
df = raw.set_index("NAME").reindex(["TESS"], axis=1)
else:
df = None
return df
# BUILD LIST OF DATA FRAMES
tsv_frames = [
get_tsv_data(os.path.join(root, dir, file))
for root, dirs, files in os.walk(r".....")
for dir in dirs
for file in os.listdir(os.path.join(root, dir))
if file.endswith(".tsv") and file.__contains__('report_for_na')
]
# HORIZONTAL MERGE
tsv_df = pd.concat(tsv_frames, axis=1)
# JOIN TO MASTER DATA FRAME AND RENAME COLUMNS
new_cols = ['C1','C2','E1','E2','M1','M2','M3','M4',
'Q1','Q2','Q3','T1','T2','T3','X1','X2']
all_methods = all_methods.join(tsv_df).set_axis(new_cols, axis=1)