【问题标题】:How to concatenate pairs of row elements into a new column in a pandas dataframe?如何将成对的行元素连接到熊猫数据框中的新列中?
【发布时间】:2019-09-25 05:55:12
【问题描述】:

我有这个 DataFrame,其中的列是坐标(例如 x1,y1,x2,y2...)。坐标列从第 8 列开始(前面的与问题无关)
我有一个更大的示例示例here,但这里有一个示例:

start_column = 8    
df = pd.DataFrame(columns = ['x1','y1','x2','y2'],
                 data = [(0,0,1,0),(0,1,2,3),(-1,-2,None,None)])
for i in range(7):
    df.insert(0,'c'+str(7-i),'x')
df

我想在 DataFrame 中创建一个新列作为 xy 对的列表,如:df["coordinates"]=[[x1,y1],[x2,y2],[x3,y3]....]

到目前为止我已经尝试过:

for row in df.iterrows():
   for i in range(1,total_count_of_xy_rows):
      df["coordinates"]= 
             df[["x{}".format(i),"y{}".format(i)]].values.tolist()
   print(df)

有没有更好的方法来做到这一点?

【问题讨论】:

  • 您的代码与预期有何不同?
  • 你的df看起来怎么样?
  • 我已经添加了数据框快照
  • 我需要在 df 中再添加一列,其中可以包含行 [[x1,y1],[x2,y2]....] 的列表
  • 而且我无法计算包含数据的 x 和 y 列的数量。因为有些行的 x y 高达 60 测量 x60 和 y60,而有些行的数据高达 x25 y25,因此另一行显示 NAN。

标签: python pandas


【解决方案1】:

您可以通过.apply 跨不同行创建自定义列表理解函数来创建新列:

start_column = 8    
coordinates_list = list(zip(df.columns[(start_column-1):-1:2],df.columns[start_column::2]))
df['coordinates'] = df.apply(lambda row: [(row[x], row[y]) 
                                          for x,y in coordinates_list if not any((pd.isna(row[x]), pd.isna(row[y])))], axis=1)

使用此示例输入,坐标列从第 8 列开始,如您在评论中所述:

df = pd.DataFrame(columns = ['x1','y1','x2','y2'],
                 data = [(0,0,1,0),(0,1,2,3),(-1,-2,None,None)])
for i in range(start_column-1):
    df.insert(0,'c'+str(start_column-1-i),'x')
df

    c1  c2  c3  c4  c5  c6  c7  x1  y1  x2  y2
0   x   x   x   x   x   x   x   0   0   1.0 0.0
1   x   x   x   x   x   x   x   0   1   2.0 3.0
2   x   x   x   x   x   x   x   -1  -2  NaN NaN

这将产生这个输出:

c1  c2  c3  c4  c5  c6  c7  x1  y1  x2  y2  coordinates
0   x   x   x   x   x   x   x   0   0   1.0 0.0 [(0, 0), (1.0, 0.0)]
1   x   x   x   x   x   x   x   0   1   2.0 3.0 [(0, 1), (2.0, 3.0)]
2   x   x   x   x   x   x   x   -1  -2  NaN NaN [(-1, -2)]

这处理每行中不相等数量的坐标。希望对您有所帮助!

【讨论】:

  • 我需要从第 8 列开始列表 zip 意味着 x 和 y 从第 8 列开始。这个怎么办?
  • 请协助,我无法提供上述 x y 从第 8 列编号开始的条件
  • 我再次编辑了您的问题以包含这个新条件,以及我的回答以适应它。将来,请确保您的答案包含回答问题所需的所有信息。我已经编辑了您的问题,以确保示例数据包含这个新条件。
  • 与此答案相关我已经发布了一个问题,请针对该问题提出建议stackoverflow.com/questions/58109579/…
  • 请为stackoverflow.com/questions/58112213/…发布的问题提出建议
猜你喜欢
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-11
  • 2018-10-09
  • 2018-03-06
  • 2021-05-02
  • 2020-10-13
  • 1970-01-01
相关资源
最近更新 更多