如何将列标题指定给相应的单元格值?

2024-10-05 12:22:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是在学习Python,在我的第一个项目中,我试图重新格式化一个可以在GIS上使用的excel表格。该表有许多列,每个对应的记录都有x。我需要用列名分配(替换x)并连接所有以逗号分隔的行。有人告诉我熊猫是一个很好的图书馆来完成这个任务。我确实开始了(参见示例代码),但我不确定下一步要做什么。任何帮助或建议都将不胜感激。以下是我试图实现的目标的视觉表现:

enter image description here

示例代码:

import pandas as pd

input_excel = r"C:\Projects\... Habitat_table.xlsx" # excel sheet path
excel = pd.read_excel(input_excel, sheet_name = 'Species_habitat') # sheet name
final_dataframe = pd.DataFrame (excel, columns=[‘Habitat_A, ‘Habitat B,C,&D’, ‘Habitat_E']) # every single column name
                               
habitats = [‘Habitat_A, ‘Habitat B,C,&D’, ‘Habitat_E']
                                                                  

for index, row in final_dataframe.iterrows():
    final_string = " "
            print (final_dataframe.columns.name)
for h in habitats:
            print(h)
    for c in index:
        if h in index.name: #checks if habitat is in column name
           print(h)
    if row[c] is not null:
            final_string == final_string + c.name + ", "
           print(final_string)

Tags: 代码namein示例dataframeforstringindex
2条回答

这里有一个解决方案

import pandas as pd
import numpy as np

data = {'species_id':[1,2,3],
            'Habitat_A':['x',np.nan,'x'],
            'Habitat_B':['x', np.nan,np.nan],
        'Habitat_C':['x', 'x',np.nan],
    }
    
df = pd.DataFrame(data)
display(df)
for col in df.columns:
    df[col] = df[col].replace('x', col+ ' ')
    df[col] = df[col].replace(np.nan, '')
df['All_Habitats']= df['Habitat_A'].astype(str) + df['Habitat_B'].astype(str)  + df['Habitat_C'].astype(str)
display(df)

输出:

    species_id  Habitat_A   Habitat_B   Habitat_C   All_Habitats
0   1           Habitat_A   Habitat_B   Habitat_C   Habitat_A Habitat_B Habitat_C
1   2                                   Habitat_C   Habitat_C
2   3           Habitat_A                           Habitat_A
data_dict = {
    'Species_ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'Habitat_A': ['X', '', 'X', 'X', '', 'X', 'X', '', 'X', ''],
    'Habitat B,C,&D': ['X', '', 'X', 'X', '', 'X', 'X', '', 'X', ''],
    'Habitat_E': ['', 'X', '', 'X', 'X', '', 'X', 'X', '', 'X'],
}

df = pd.DataFrame.from_dict(data_dict)
df.iloc[:, 1:] = df.iloc[:, 1:].apply(lambda x: pd.Series([y[0] if y[1] == 'X' else '' for y in x.iteritems()]), axis=1)
df['All_habitats(CONCAT)'] = df.apply(lambda x: ','.join(filter(None, x[1:])), axis=1)
print(df)

印刷品:

   Species_ID  Habitat_A  Habitat B,C,&D  Habitat_E                All_habitats(CONCAT)
0           1  Habitat_A  Habitat B,C,&D                       Habitat_A,Habitat B,C,&D
1           2                             Habitat_E                           Habitat_E
2           3  Habitat_A  Habitat B,C,&D                       Habitat_A,Habitat B,C,&D
3           4  Habitat_A  Habitat B,C,&D  Habitat_E  Habitat_A,Habitat B,C,&D,Habitat_E
4           5                             Habitat_E                           Habitat_E
5           6  Habitat_A  Habitat B,C,&D                       Habitat_A,Habitat B,C,&D
6           7  Habitat_A  Habitat B,C,&D  Habitat_E  Habitat_A,Habitat B,C,&D,Habitat_E
7           8                             Habitat_E                           Habitat_E
8           9  Habitat_A  Habitat B,C,&D                       Habitat_A,Habitat B,C,&D
9          10                             Habitat_E                           Habitat_E

测试.csv中的2095行*19列(虚拟数据)

import pandas as pd, time

tic = time.perf_counter()
df = pd.read_csv(r'c:\Users\Alex20\Documents\Habitats.csv')

df.iloc[:, 1:] = df.iloc[:, 1:].apply(lambda x: pd.Series([y[0] if y[1] == 'X' else '' for y in x.iteritems()]), axis=1)
df['All_habitats(CONCAT)'] = df.apply(lambda x: ','.join(filter(None, x[1:])), axis=1)
print(df)

print(f"Processed in {time.perf_counter() - tic:0.4f} seconds")

输出:

      Species_ID  ...                               All_habitats(CONCAT)
0              1  ...  HabitatA,HabitatB,HabitatC,HabitatD,HabitatF,H...
1              2  ...                         HabitatC,HabitatG,HabitatP
2              3  ...  HabitatA,HabitatB,HabitatC,HabitatE,HabitatG,H...
3              4  ...  HabitatA,HabitatB,HabitatE,HabitatJ,HabitatL,H...
4              5  ...  HabitatD,HabitatI,HabitatK,HabitatL,HabitatM,H...
...          ...  ...                                                ...
2090        2091  ...  HabitatA,HabitatB,HabitatE,HabitatF,HabitatG,H...
2091        2092  ...  HabitatA,HabitatB,HabitatC,HabitatE,HabitatF,H...
2092        2093  ...  HabitatB,HabitatC,HabitatD,HabitatG,HabitatH,H...
2093        2094  ...  HabitatC,HabitatF,HabitatG,HabitatI,HabitatK,H...
2094        2095  ...  HabitatB,HabitatE,HabitatG,HabitatI,HabitatK,H...

[2095 rows x 19 columns]
Processed in 0.4257 seconds

.csv
enter image description here

相关问题 更多 >

    热门问题