我的数据框如下所示:
P Q L
1 2 3
2 3
4 5 6,7
目标是检查L
中是否有任何值,如果在L
和P
列上提取了值
P L
1 3
4,6
4,7
注意L
中可能有多个值,如果值超过1,我需要行。
以下是我当前的脚本,它无法生成预期的结果。
df2 = []
ego
other
newrow = []
for item in data_DF.iterrows():
if item[1]["L"] is not None:
ego = item[1]['P']
other = item[1]['L']
newrow = ego + other + "\n"
df2.append(newrow)
data_DF2 = pd.DataFrame(df2)
答案 0 :(得分:1)
首先,您可以提取L
和P
列的所有行,其中L
不会丢失,如下所示:
df2 = df[~pd.isnull(df.L)].loc[:, ['P', 'L']].set_index('P')
接下来,您可以按如下方式处理剩余L
行中的多个值:
df2 = df2.L.str.split(',', expand=True).stack()
df2 = df2.reset_index().drop('level_1', axis=1).rename(columns={0: 'L'}).dropna()
df2.L = df2.L.str.strip()
要解释:P
为index
,代码会在string
上拆分L
列的','
内容,并将各个元素分配到各个列。然后它将各种新列堆叠到一个新列中,并清除结果。
答案 1 :(得分:0)
首先,我将列L
的多个值提取到具有原始索引的双重索引的新数据帧s
。删除不必要的列L
和Q
。然后输出连接到原始df
并删除具有NaN
值的行。
print df
P Q L
0 1 2 3
1 2 3 NaN
2 4 5 6,7
s = df['L'].str.split(',').apply(pd.Series, 1).stack()
s.index = s.index.droplevel(-1) # to line up with df's index
s.name = 'L'
print s
0 3
2 6
2 7
Name: L, dtype: object
df = df.drop( ['L', 'Q'], axis=1)
df = df.join(s)
print df
P L
0 1 3
1 2 NaN
2 4 6
2 4 7
df = df.dropna().reset_index(drop=True)
print df
P L
0 1 3
1 4 6
2 4 7