Monika_kosecka
Monika_kosecka

Reputation: 1

python pandas: fulfill condition and assign a value to it

I am really hoping you can help me here...I need to assign a label(df_label) to an exact file within dataframe (df_data) and save all labels that appear in each file in a separate txt file (that's an easy bit)

df_data:

              file_name  file_start   file_end
0   20190201_000004.wav       0.000   1196.000
1   20190201_002003.wav    1196.000   2392.992
2   20190201_004004.wav    2392.992   3588.992
3   20190201_010003.wav    3588.992   4785.984
4   20190201_012003.wav    4785.984   5982.976
df_label:
Begin Time (s)
0     27467.100000
1     43830.400000
2     43830.800000
3     46378.200000

I have tried to switch to np.array and use for loop and np.where but without any success...

Upvotes: 0

Views: 182

Answers (2)

Kedar
Kedar

Reputation: 1698

If the time values in df_label fall under exactly one entry in df_data, you can use the following

def get_file_name(begin_time):
    file_names = df_data[
        (df_data["file_start"] <= begin_time)
         & (df_data["file_end"] >= begin_time)
    ]["file_name"].values
    return file_names.values[0] if file_names.values.size > 0 else None

df_label["file_name"] = df_label["Begin Time (s)"].apply(get_label)

This will add another col file_name to df_label

Upvotes: 1

SzalonyKefir
SzalonyKefir

Reputation: 88

If the labels from df_label matches the order of files in df_data you can simply:

  • add the labels as new column of df_data (df_data["label"] = df_label["Begin Time (s)"]).

or

  • use DataFrame.merge() function (df_data = df_data.merge(df_labels, left_index=True, right_index=True)).

More about merging/joining with examples you can find here:

https://thispointer.com/pandas-how-to-merge-dataframes-by-index-using-dataframe-merge-part-3/

https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

Upvotes: 0

Related Questions