我的问题是我想把它们做成单行。但是,它只是有条件地在 Xlabel 中的行下遇到小写时。在另一侧,多行被缩小,使 Ylabel 只有 NaN 值也要缩小
所以我有这样的数据帧:
Xlabel Ylabel
0 Baby doll 240.0
1 Benet doll 30.0
2 lingling NaN
3 Kurachaa NaN
4 mothers NaN
5 day NaN
6 Grape day 100.0
7 holidays NaN
8 Halari doom 90.0
9 Korsira ja 110.0
10 Hujarata 940.0
11 hoom hoom NaN
12 laka laka NaN
13 cherry NaN
然后变得像
xlabel Ylabel
0 Baby doll 240.0
1 Benet doll lingling 30.0
2 Kurachaa mothers day NaN
3 Grape day holidays 100.0
4 Halari doom 90.0
5 Korsira ja 110.0
6 Hujarata hoom hoom laka laka cherry 940.0
我怎样才能做到这一点?
我们可以使用str.contains
来检查列字符串中第一个大写字母的出现Xlabel
然后在这个布尔掩码上取累积总和来识别属于同一句子的连续单词块,最后对这些块上的数据帧进行分组,并使用join
聚合列Xlabel
,使用first
Ylabel
b = df['Xlabel'].str.contains(r'^[A-Z]').cumsum()
df.groupby(b, as_index=False).agg({'Xlabel': ' '.join, 'Ylabel': 'first'})
<小时 />Xlabel Ylabel
0 Baby doll 240.0
1 Benet doll lingling 30.0
2 Kurachaa mothers day NaN
3 Grape day holidays 100.0
4 Halari doom 90.0
5 Korsira ja 110.0
6 Hujarata hoom hoom laka laka cherry 940.0
最直接的方法是使用 for 循环逐行遍历数据帧,以检查Xlabel
是否以小写形式启动。例如:
import pandas as pd
import string
new_df = pd.DataFrame(columns=df.columns)
temp_df = pd.DataFrame(columns=df.columns)
for idx in range(len(df)):
if df["Xlabel"][idx][0] in string.ascii_uppercase:
temp_df = df.iloc[idx]
else:
# do something
temp_df["Xlabel"] = temp_df["Xlabel"]+" "+df["Xlabel"][idx]
new_df = new_df.append(temp_df)