Python 将单个列从csv转换为分层列
当我导入一个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
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