首页 > 解决方案 > 我需要用户输入从一个数据框指向另一个数据框并显示第二个数据框-python 中的一列

问题描述

我有 2 个熊猫数据框:

  1. 州缩写和州。 在此处输入图像描述
  2. 州名和每个州的所有国家公园。这不是整个数据框。 在此处输入图像描述

我需要在状态数据框中搜索用户输入,在本例中为状态缩写,然后取相邻的值、全名并使用它来显示 parks 数据框中的正确列。我相信如果它们是一个数据框,这可能会更容易,但我想不出一种方法来做到这一点并保留所有功能;我希望能够为用户显示状态数据框。任何建议将不胜感激。这是我的代码。在第 72 行附近,我可以使用帮助。在保持这个功能的同时,我尽可能地保留了它,它是一个大型程序,但这是我迄今为止最大的问题。谢谢你

def main():
if __name__ == "__main__":
    import pandas as pd
    import numpy as np
    from tabulate import tabulate

def parks():
    park_dict = {'Alaska': ['DENA', 'Denali National Park and Preserve', 'GAAR', 'Gates of the Arctic National Park', 'GLBA',
                   'Glacier Bay National Park', 'KATM', 'Katmai National Park and Preserve', 'KEFJ',
                   'Kenai Fjords National Park', 'KOVA', 'Kobuk Valley National Park', 'LACLk', 'Lake Clark National Park',
                   'WRST', 'Wrangell – St Elias National Park and Preserve'],
        'American_Samoa': ['NSPA', 'National Park of American Samoa','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Arizona': ['GRCA', 'Grand Canyon National Park', 'PEFO', 'Petrified Forest National Park', 'SAGU',
                    'Saguaro National Park','.','.','.','.','.','.','.','.','.','.'],
        'Arkansas': ['HOSP', 'Hot Springs National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'California': ['CHIS', 'Channel Islands National Park', 'DVNP', 'Death Valley National Park', 'JOTR',
                       'Joshua Tree National Park', 'KICA', 'Kings Canyon National Park', 'LAVO',
                       'Lassen Volcanic National Park', 'REDW', 'Redwood National Park', 'SEKI',
                       'Sequoia National Park', 'YOSE','Yosemite National Park'],
        'Caolorado': ['BLCA', 'Black Canyon of the Gunnison National Park', 'GRSA',
                      'Great Sand Dunes National Park and Preserve', 'MEVE', 'Mesa Verde National Park',
                      'ROMO','Rocky Mountain National Park','.','.','.','.','.','.','.','.'],
        'Florida': ['BISC', 'Biscayne National Park', 'DRTO', 'Dry Tortugas National Park', 'EVER',
                    'Everglades National Park','.','.','.','.','.','.','.','.','.','.'],
        'Hawaii': ['HALE', 'Haleakala National Park', 'HAVO', 'Hawaii Volcanoes National Park','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Kentucky': ['MACA', 'Mammoth Cave National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Maine': ['ACAD', 'Acadia National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Michigan': ['ISRO', 'Isle Royale National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Minnesota': ['VOYA', 'Voyageurs National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Montana': ['GLAC', 'Glacier National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Nevada': ['GRBA', 'Great Basin National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'New_Mexico': ['CAVE', 'Carlsbad Caverns National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'North_Carolina': ['GRSM', 'Great Smoky Mountains National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'North_Dakota': ['THRO', 'Theodore Roosevelt National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Ohio': ['CUVA', 'Cuyahoga Valley National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Oregon': ['CRLA', 'Crater Lake National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'South_Carolina': ['COSW', 'Congaree National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'South_Dakota': ['BADL', 'Badlands National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Tennessee': ['GRSM', 'Great Smoky Mountains National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Texas': ['BIBE', 'Big Bend National Park', 'GUMO', 'Guadalupe Mountains National Park','','','','','','','','','','','',''],
        'US_Virgin_Islands': ['VIIS', 'Virgin Islands National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Utah': ['ARCH', 'Arches National Park', 'BRCA', 'Bryce Canyon National Park', 'CANY',
                 'Canyonlands National Park', 'CARE', 'Capitol Reef National Park', 'ZION', 'Zion National Park','.','.','.','.','.','.'],
        'Virginia': ['SHEN', 'Shenandoah National Park','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
        'Washington': ['MORA ', 'Mount Rainier National Park ', 'NOCA', 'North Cascades National Park', 'OLYM',
                       'Olympic National Park','.','.','.','.','.','.','.','.','.','.'],
        'Wyoming': ['GRTE', 'Grand Teton National Park', 'YELL', 'Yellowstone National Park','.','.','.','.','.','.','.','.','.','.','.','.']}
    df = pd.DataFrame(park_dict)
    df.index = np.arange(1, len(df) + 1)
    #print(tabulate(df, headers='keys', tablefmt='simple'))
    return''

def choose_state():
    state_list = [['AK', 'Alaska', 'AS', 'American Samoa', 'AZ', 'Arizona', 'AR', 'Arkansas'],
                  ['CA', 'California', 'CO', 'Colorado', 'FL', 'Florida', 'HI', 'Hawaii'],
                  ['KY', 'Kentucky', 'ME', 'Maine', 'MI', 'Michigan', 'MN', 'Minnesota'],
                  ['MT', 'Montana', 'NV', 'Nevada', 'NM', 'New Mexico', 'NC', 'North Carolina'],
                  ['ND', 'North Dakota', 'OH', 'Ohio', 'OR', 'Oregon', 'SC', 'South Carolina'],
                  ['SD', 'South Dakota', 'TN', 'Tennessee', 'TX', 'Texas', 'USVI', 'US Vergin Islands'],
                  ['UT', 'Utah', 'VA', 'Virginia', 'WA', 'Washington', 'WY', 'Wyoming']]

    statedf = pd.DataFrame(state_list, columns=['Abbr', 'State', 'Abbr', 'State', 'Abbr', 'State', 'Abbr', 'State'])
    print(tabulate(statedf, headers='keys', tablefmt='simple', showindex=False))
    while True:
        print('\nEnter the abreviation for the state you will visit\nR - Return tp previous menu\nQ - Quit')
        try:
            entry = str(input('\n').upper())
            if not entry.isalpha():
                print('please enter letters only.')
                choose_state()
                '''
                # if entry == (state abbr) in state_list, then take the full name of the state and look in (park_dict) and display the correct column)
                '''
                print(tabulate(park_dict, headers='keys', tablefmt='simple'))  # print correct column from park_dict

            elif entry == str('R'):
                choose_state()
            elif entry == str('Q'):
                print('Have a nice day.')
                exit()
            else:
                print('please enter 2 letter state abreviation.')
        except ValueError:
            print('Invalid entry')
            choose_state()
            break
    return ''

def main_menu():
    print('Select choice from menu:\n\n'
          '1 - not ready\n'
          '2 - Select state and National Park you are visiting\n'
          '3 - Quit')

    while True:
        try:
            menu_choice = int(input('\n'))
            if menu_choice == int(1):
                print('ok')
                exit()
            elif menu_choice == int(2):
                choose_state()
                break
            elif menu_choice == int(3):
                print('Exiting program')
                exit()
            else:
                print('Value not recognized.')
                exit()
        except ValueError:
            print('Invalid entry, please enter 1,2, or 3.')
            main_menu()
    return ''

print(main_menu())

主要的()

更新:我按照下面的 MashodRana 建议更改了我的代码,它确实有助于清理它,但它工作不正确。我不断收到属性错误。我打算把字典当作 csv 文件来帮助清理它,但我认为它应该可以工作。

这些是错误: raise AttributeError(f"module 'pandas' has no attribute '{name}'") AttributeError: module 'pandas' has no attribute 'tabulate'

import pandas as pd
import numpy as np
from tabulate import tabulate
import csv



park_dict = {
    'Alaska': ['DENA', 'Denali National Park and Preserve', 'GAAR', 'Gates of the Arctic National Park', 'GLBA',
                   'Glacier Bay National Park', 'KATM', 'Katmai National Park and Preserve', 'KEFJ',
                   'Kenai Fjords National Park', 'KOVA', 'Kobuk Valley National Park', 'LACLk',
                   'Lake Clark National Park',
                   'WRST', 'Wrangell – St Elias National Park and Preserve'],
    'American_Samoa': ['NSPA', 'National Park of American Samoa', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                           '.', '.', '.', '.'],
    'Arizona': ['GRCA', 'Grand Canyon National Park', 'PEFO', 'Petrified Forest National Park', 'SAGU',
                    'Saguaro National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
    'Arkansas': ['HOSP', 'Hot Springs National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                     '.', '.'],
    'California': ['CHIS', 'Channel Islands National Park', 'DVNP', 'Death Valley National Park', 'JOTR',
                       'Joshua Tree National Park', 'KICA', 'Kings Canyon National Park', 'LAVO',
                       'Lassen Volcanic National Park', 'REDW', 'Redwood National Park', 'SEKI',
                       'Sequoia National Park', 'YOSE', 'Yosemite National Park'],
    'Colorado': ['BLCA', 'Black Canyon of the Gunnison National Park', 'GRSA',
                      'Great Sand Dunes National Park and Preserve', 'MEVE', 'Mesa Verde National Park',
                      'ROMO', 'Rocky Mountain National Park', '.', '.', '.', '.', '.', '.', '.', '.'],
    'Florida': ['BISC', 'Biscayne National Park', 'DRTO', 'Dry Tortugas National Park', 'EVER',
                    'Everglades National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
    'Hawaii': ['HALE', 'Haleakala National Park', 'HAVO', 'Hawaii Volcanoes National Park', '.', '.', '.', '.', '.',
                   '.', '.', '.', '.', '.', '.', '.'],
    'Kentucky': ['MACA', 'Mammoth Cave National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                     '.', '.'],
    'Maine': ['ACAD', 'Acadia National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
    'Michigan': ['ISRO', 'Isle Royale National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                     '.', '.'],
    'Minnesota': ['VOYA', 'Voyageurs National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                      '.', '.'],
    'Montana': ['GLAC', 'Glacier National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                    '.'],
    'Nevada': ['GRBA', 'Great Basin National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                   '.'],
    'New_Mexico': ['CAVE', 'Carlsbad Caverns National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                       '.', '.', '.'],
    'North_Carolina': ['GRSM', 'Great Smoky Mountains National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                           '.', '.', '.', '.', '.'],
    'North_Dakota': ['THRO', 'Theodore Roosevelt National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                         '.', '.', '.', '.'],
    'Ohio': ['CUVA', 'Cuyahoga Valley National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                 '.', '.'],
    'Oregon': ['CRLA', 'Crater Lake National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                   '.'],
    'South_Carolina': ['COSW', 'Congaree National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                           '.', '.'],
    'South_Dakota': ['BADL', 'Badlands National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                         '.', '.'],
    'Tennessee': ['GRSM', 'Great Smoky Mountains National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                      '.', '.', '.', '.'],
    'Texas': ['BIBE', 'Big Bend National Park', 'GUMO', 'Guadalupe Mountains National Park', '', '', '', '', '', '',
                  '', '', '', '', '', ''],
    'US_Virgin_Islands': ['VIIS', 'Virgin Islands National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                              '.', '.', '.', '.'],
    'Utah': ['ARCH', 'Arches National Park', 'BRCA', 'Bryce Canyon National Park', 'CANY',
                 'Canyonlands National Park', 'CARE', 'Capitol Reef National Park', 'ZION', 'Zion National Park', '.',
                 '.', '.', '.', '.', '.'],
    'Virginia': ['SHEN', 'Shenandoah National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
                     '.', '.'],
    'Washington': ['MORA ', 'Mount Rainier National Park ', 'NOCA', 'North Cascades National Park', 'OLYM',
                       'Olympic National Park', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
    'Wyoming': ['GRTE', 'Grand Teton National Park', 'YELL', 'Yellowstone National Park', '.', '.', '.', '.', '.',
                    '.', '.', '.', '.', '.', '.', '.']}
pdf = pd.DataFrame(park_dict)
pdf.index = np.arange(1, len(pdf) + 1)
#print(tabulate(pdf, headers='keys', tablefmt='simple'))
pdf.to_csv(r'park_dict.csv')



state_list = [['AK', 'Alaska', 'AS', 'American Samoa', 'AZ', 'Arizona', 'AR', 'Arkansas'],
                  ['CA', 'California', 'CO', 'Colorado', 'FL', 'Florida', 'HI', 'Hawaii'],
                  ['KY', 'Kentucky', 'ME', 'Maine', 'MI', 'Michigan', 'MN', 'Minnesota'],
                  ['MT', 'Montana', 'NV', 'Nevada', 'NM', 'New Mexico', 'NC', 'North Carolina'],
                  ['ND', 'North Dakota', 'OH', 'Ohio', 'OR', 'Oregon', 'SC', 'South Carolina'],
                  ['SD', 'South Dakota', 'TN', 'Tennessee', 'TX', 'Texas', 'USVI', 'US Virgin Islands'],
                  ['UT', 'Utah', 'VA', 'Virginia', 'WA', 'Washington', 'WY', 'Wyoming']]

sdf = pd.DataFrame(state_list, columns=['Abbr', 'State', 'Abbr', 'State', 'Abbr', 'State', 'Abbr', 'State'])
sdf = pd.DataFrame({'abbr': sdf['Abbr'].values.flatten(), 'state': sdf['State'].values.flatten()})
#sdf.to_csv(r'state_dict.csv')
#print(tabulate(sdf, headers='keys', tablefmt='simple', showindex=False))

def trail_finder():
    with open('AllTrails data.csv', 'r') as f:
        all_park_data = csv.reader(f)
        all_park_info = list(all_park_data)
#   print('\n'.join(' '.join(elems) for elems in all_park_info)) #just to verify data
    f.close()


def main():



    def choose_destination():
        print(tabulate(sdf, headers='keys', tablefmt='simple', showindex=False))
        # user input
        entry = str(input('Enter the abreviation for the state you will visit:\n').upper())
        while True:
            try:
                val = sdf[sdf['abbr'] == entry]
                state_name = val.values.flatten()[1]
                print(pd.tabulate(pdf))
                ndf = {state_name: pdf[state_name].values}
                print(tabulate(ndf, headers='keys', tablefmt='simple'))
                # error checking
                if not entry.isalpha():
                    print('please enter letters only.')
                else:
                    print('please enter 2 letter state abreviation.')
            except ValueError:
                print('Invalid entry')
                break
        return ''

    def fitness_menu():
        print('1 - Determine fitness level\n2 - proceed to Trail Finder\n3 - Quit')
        while True:
            try:
                menu_choice = int(input('\n'))
                if menu_choice == int(1):
                    print('FIXME- build fitness level code')
                    break
                elif menu_choice == int(2):
                    choose_destination()
                    break
                elif menu_choice == int(3):
                    print('Exiting program')
                    exit()
                else:
                    print('Invalid entry, please enter 1, 2, or 3.')
                    exit()
            except ValueError:
                print(ValueError)
                exit()
        return ''


    def entrance_menu():

        print('Select choice from menu:\n\n'
            '1 - To use fitness calculator to determine fitness level(optional) \n'
            '2 - To choose destination\n'
            '3 - To Quit')

        while True:
            try:
                menu_choice = int(input('\n'))
                if menu_choice == int(1):
                    fitness_menu()
                    break
                elif menu_choice == int(2):
                    choose_destination()
                    break
                elif menu_choice == int(3):
                    print('Exiting program')
                    exit()
                else:
                    print('Invalid entry, please enter 1, 2, or 3.')
                    entrance_menu()
            except ValueError:
                print(ValueError)
                exit()
        return ''

    entrance_menu()


main()

标签: pythonpandasdataframe

解决方案


您可以通过以下方式完成您的任务:

将所有状态和缩写组合成一列

sdf = pd.DataFrame({'abbr':statedf['Abbr'].values.flatten(),'state':statedf['State'].values.flatten()})

在sdf (状态数据框)中搜索缩写并提取相应的完整形式

val = sdf[sdf['abbr']==entry]
state_name = val.values.flatten()[1]

最后显示来自pdf(公园数据框)的州名对应的公园

ndf = {state_name:pdf[state_name].values}
print(tabulate(ndf, headers='keys', tablefmt='simple', showindex=False))

注意: 请将您的公园和州保存为 CSV 文件。然后将它们加载到您的程序中。不要将不同的列用于相同类型的值,例如“状态”和“缩写”。如果您愿意,可以通过多种方式改进代码。


推荐阅读