Работа со строками в питоне

Я пытаюсь получить csv в файл формата .gexf для динамического графика gephi. Идея состоит в том, чтобы все параллельные ребра (ребра с одним и тем же источником и целью, но разными датами публикации) содержались в данных атрибута. В этом примере все даты в атрибуте соответствуют датам публикации ответа Джона на вопрос Яна на форуме для обсуждения онлайн-курса.

Как мне получить csv, выглядящий так:

Jan John    2012-04-07  2012-06-06
Jan Jason   2012-05-07  2012-06-06
Jan John    2012-03-02  2012-06-07
Jan Jason   2012-03-20  2012-06-08
Jan Jack    2012-03-26  2012-06-09
Jan Janet   2012-05-01  2012-06-10
Jan Jack    2012-05-04  2012-06-11
Jan Jason   2012-05-07  2012-06-12
Jan Jack    2012-05-09  2012-06-13
Jan John    2012-05-15  2012-06-14
Jan Janet   2012-05-15  2012-06-15
Jan Jason   2012-05-20  2012-06-16
Jan Jack    2012-05-23  2012-06-17
Jan Josh    2012-05-25  2012-06-18
Jan Jack    2012-05-28  2012-06-19
Jan Josh    2012-06-01  2012-06-20

в такой формат:

<edge source="Jan" target="John" start="2012-02-20" end="2012-06-06" weight="1" id="133">
        <attvalues>
          <attvalue for="0" value="1" start="2012-04-07" end="2012-06-06"/>
          <attvalue for="0" value="2" start="2012-06-06" end="2012-06-06"/>
          <attvalue for="0" value="3" start="2012-06-06" end="2012-06-06"/>
        </attvalues>
 </edge>
<next edge...
</next edge>

То, как я пытался это сделать, не работает так хорошо. Я попытался создать два списка и для каждой записи в первом списке выполнить поиск, чтобы найти совпадение первых двух записей во втором списке. Если есть совпадение, мой скрипт удалит строку во втором списке и добавит пару дат. С каждой строкой, представляющей полное количество соответствий между вопрошающим и отвечающим, я затем написал сценарий для преобразования строки в данные ребра/атрибута. Я использовал это как своего рода руководство.


person goldisfine    schedule 14.06.2013    source источник
comment
ну ты сам что-нибудь пробовал?   -  person Fredrik Pihl    schedule 14.06.2013
comment
Откуда берутся даты start и end? Я не могу сказать, в чем вопрос.   -  person Joe Frambach    schedule 14.06.2013
comment
Я не вижу корреляции между Джоном и датами в цели. Просьба уточнить   -  person Fredrik Pihl    schedule 14.06.2013
comment
...и откуда 2007-01-22? Это фиксированная строка, присутствующая во всех ребрах?   -  person Fredrik Pihl    schedule 14.06.2013
comment
Я бы использовал для этого строковые шаблоны. Разберите данные с помощью csv-модуля, поместите их в словарь и используйте шаблон, чтобы сделать замену. Удачи и, пожалуйста, обновите свой вопрос с помощью кода, если вы застряли, и мы будем рады помочь! Много примеров в предоставленных ссылках, чтобы вы начали...   -  person Fredrik Pihl    schedule 14.06.2013
comment
Изучаем эти строковые шаблоны прямо сейчас! Извините за неразборчивость. Спасибо, и я обязательно продолжу публиковать сообщения, когда отключусь.   -  person goldisfine    schedule 14.06.2013


Ответы (1)


Посмотрите на проект Python pandas, который разработан для упрощения такого рода операций. Пример того, как он может группировать и анализировать ваши данные....

# Load your CSV as a pandas 'DataFrame'.
In [13]: df = pd.read_csv('your file', names=['source', 'target', 'start', 'end'])

# Look at the first few rows. It worked.
In [14]: df.head()
Out[14]: 
  source target       start         end
0    Jan  Jason  2012-05-07  2012-06-06
1    Jan   John  2012-03-02  2012-06-07
2    Jan  Jason  2012-03-20  2012-06-08
3    Jan   Jack  2012-03-26  2012-06-09
4    Jan  Janet  2012-05-01  2012-06-10

# Group the rows by the the name columns. Each unique pair gets its own group.
In [15]: edges = df.groupby(['source', 'target'])

In [16]: for (source, target), edge in edges: # consider each unique name pair an edge
    print source, target
    for _, row in edge.iterrows(): # loop through all the rows belonging to these names
        print row['start'], row['end']
   ....:         
Jan Jack
2012-03-26 2012-06-09
2012-05-04 2012-06-11
2012-05-09 2012-06-13
2012-05-23 2012-06-17
2012-05-28 2012-06-19
Jan Janet
2012-05-01 2012-06-10
2012-05-15 2012-06-15
Jan Jason
2012-05-07 2012-06-06
2012-03-20 2012-06-08
2012-05-07 2012-06-12
2012-05-20 2012-06-16
Jan John
2012-03-02 2012-06-07
2012-05-15 2012-06-14
Jan Josh
2012-05-25 2012-06-18
2012-06-01 2012-06-20

Остается только доработать эти операторы печати с вашим XML и, возможно, вывести их в файл вместо печати.

person Dan Allan    schedule 14.06.2013
comment
Спасибо Дэн! Это кажется невероятно полезным. Я начну играть с этим. - person goldisfine; 15.06.2013
comment
Он работает на всех платформах. Я также использую его на Mac. См. pandas.pydata.org/pandas-docs/stable/install. .html#все платформы - person Dan Allan; 15.06.2013
comment
Это доступно для Mac? Я попытался запустить pip install pandas и получил failed with error code 1 - person goldisfine; 15.06.2013
comment
Без более конкретной ошибки я не знаю, как вам помочь. Я установил и использовал это на паре компьютеров Mac. Если pip не работает, поиск по запросу install pandas Mac на StackOverflow выдает множество тем, в которых обсуждаются альтернативы. Я полагаю, что где-то в Интернете есть двоичный файл, например, для Windows, но я тоже не могу его найти. @Джефф? - person Dan Allan; 15.06.2013
comment
@goldisfine вам нужно установить numpy и cython перед установкой pandas - person Phillip Cloud; 15.06.2013