Python 将单个列从csv转换为分层列

Python 将单个列从csv转换为分层列,python,pandas,Python,Pandas,当我导入一个csv文件时,该文件包含一个由州和城市组成的列,例如: ALABAMA NaN Birmingham Montgomery Huntsville NaN CALIFORNIA NaN Los Angeles San Diego Fresno NaN 我的问题是,如何将其转换为两个分层列,使其看起来更像以下内容: ALABAMA Birmingham Montgomery Huntsville CALIFORNIA Los Angel

当我导入一个csv文件时,该文件包含一个由州和城市组成的列,例如:

ALABAMA
NaN
Birmingham
Montgomery
Huntsville
NaN
CALIFORNIA
NaN
Los Angeles
San Diego
Fresno
NaN
我的问题是,如何将其转换为两个分层列,使其看起来更像以下内容:

ALABAMA    Birmingham
           Montgomery
           Huntsville
CALIFORNIA Los Angeles
           San Diego
           Fresno
我尝试创建一个emtpy系列,并用city列中每一行的值填充它,目的是将该系列作为额外列导入,但我一直无法使其工作

我的代码:

i = 0
numcol = []
for STATE in city_state_df['citystate']:
    if STATE == '':        
        numcol.append(STATE_df['citystate'][i])
        i += 1
    elif STATE != '': 
        numcol.append(STATE_df['citystate'][i])
        i += 1
numcol

将数据读入数据帧

df = pd.read_csv('my_file.csv')
这里,我假设这个列叫做place

使用groupby将以状态all caps开始的所有行分组到下一个状态,为每个组选择状态的第一个位置,并将其分配给数据框中的新列

df['state'] = df.groupby(df.place.str.isupper().cumsum()).place.transform('first')
然后删除位置为null或位置==状态的行


另一个可能不太像Python的解决方案是:

city_state_df = pd.DataFrame({'citystate' :['ALABAMA', np.NaN, 'Birmingham', 'Huntsville', np.NaN,'CALIFORNIA',np.NaN, 'Los Angeles','San Diego',np.NaN]})

     citystate
0      ALABAMA
1          NaN
2   Birmingham
3   Huntsville
4          NaN
5   CALIFORNIA
6          NaN
7  Los Angeles
8    San Diego
9          NaN
复制该列并删除第一列中非大写的行和第二列中的大写行。首先使用bfill并删除空的行。最后重命名列

city_state_df['city'] = city_state_df['citystate']
city_state_df = city_state_df.replace(np.nan, '', regex=True)
city_state_df['citystate'] = city_state_df['citystate'].apply(lambda x: x if x.isupper() else np.NaN).ffill()
city_state_df['city'] = city_state_df['city'].apply(lambda x: np.NaN if x.isupper() else x)
city_state_df = city_state_df.replace('', np.NaN, regex=True).dropna(subset=['city'])
city_state_df.columns = ['state', 'city']
输出:

        state         city
2     ALABAMA   Birmingham
3     ALABAMA   Huntsville
7  CALIFORNIA  Los Angeles
8  CALIFORNIA    San Diego

你的逻辑是什么?所有的上限都是州?跟在阿南后面的那一排?NaN之前的行?是的,在原始的单列文件中,状态是大写的,每个状态之前和之后的行是空的,显示为NaN。我还应该提到,单列文件称为cityState,我希望它作为两列,分别标题为city和state。我认为每个城市的专栏可能都需要重复国家专栏。我不确定熊猫能做到这一点。如果是我,我会编写一个python脚本来重新格式化文件,使其看起来像:阿拉巴马州、伯明翰\n阿拉巴马州、蒙哥马利\n加利福尼亚州、洛杉矶\n然后用pandas read_csv阅读。谢谢阿里,这正是我要找的!谢谢乔,这是我可以考虑的另一种选择。
        state         city
2     ALABAMA   Birmingham
3     ALABAMA   Huntsville
7  CALIFORNIA  Los Angeles
8  CALIFORNIA    San Diego